#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