SQL Server: Как проверить, существует ли пользователь Windows в базе данных, но под другим именем пользователя

#sql #sql-server #sql-server-2005 #tsql #sql-server-2008

#sql #sql-сервер #sql-server-2005 #tsql #sql-server-2008

Вопрос:

Я пытаюсь создать пользователя с помощью скрипта T-SQL в SQL Server 2005/2008. Я запускаю следующий SQL, чтобы проверить, существует ли пользователь, и создаю пользователя, если это не так:

 IF NOT EXISTS (SELECT * 
               FROM   sys.database_principals 
               WHERE  name = N'MyDomainMyUser') 
  BEGIN 
      CREATE USER [MyDomainMyUser] FOR LOGIN [MyDomainMyUser] WITH default_schema=[dbo]; 

      SELECT 1; 
  END 
ELSE 
  BEGIN 
      SELECT 0; 
  END  
  

К сожалению, это не работает, когда учетная запись Windows MyDomain MyUser уже находится в базе данных, но под другим именем. Примером этого может быть, если MyDomain MyUser была учетная запись, которая создала базу данных, тогда она уже будет находиться в базе данных под именем пользователя dbo. В этом случае я получаю следующую ошибку:

Сообщение 15063, уровень 16, состояние 1, строка 1 Для входа в систему уже есть учетная запись под другим именем пользователя.

Как я могу проверить, является ли пользователь Windows MyDomain MyUser уже пользователем в базе данных, даже если он находится под другим именем пользователя?

Ответ №1:

Проведите тестирование для пользователя Windows против sys.database_principals, используя SID, а не имя / user_id:

 select * from sys.database_principals where sid = SUSER_SID(N'MyDomainMyUser')
  

Поскольку при этом используется SID идентификатора входа, не имеет значения, с каким именем он был сопоставлен в базе данных.

Комментарии:

1. вместо этого мне нужно было выбрать from sys.syslogins 1 для SUSER_SID