T-SQL: SUSER_SNAME против SUSER_NAME?
В документации MSDN для функция SUSER_SNAME:
Возвращает имя идентификации входа из идентификационного номера безопасности пользователя (SID).
Более того, он говорит для функции SUSER_NAME:
Возвращает имя пользователя для входа в систему.
Тем не менее, когда я выполняю следующие инструкции SQL, я получаю тот же результат:
SELECT SUSER_NAME();
SELECT SUSER_SNAME();
Итак, каковы различия, и какой из них я должен использовать? Есть ли ситуация, которую я должен использовать, а другой?
Пожалуйста, совет,
Заранее спасибо:)
Ответы
Ответ 1
Если вы вызываете функцию без аргумента, они оба возвращают одно и то же значение. Но они принимают разные аргументы:
- SUSER_SNAME() принимает
varbinary(85) SID
аргумента login как аргумента
- SUSER_NAME() принимает
integer principal_id
для входа в систему
Вы можете проверить это как:
select suser_name(principal_id)
, suser_name(sid)
, suser_sname(principal_id)
, suser_sname(sid)
from sys.server_principals
where name = suser_name()
Только первый и последний столбец возвращают ненулевые значения.
Ответ 2
SUSER_NAME() вернет имя, связанное с sid, которое существует в sys.server_principals. Сид должен существовать в sys.server_principals.
SUSER_SNAME() может это сделать, но также может возвращать sid имени входа, если логин является членом группы активных каталогов
Итак, если у вас есть [CONTOSO\MyGroup] в Active Directory, и у этой группы есть один пользователь [CONTOSO\MyUser]
И вы добавляете эту группу в SQL Server:
СОЗДАТЬ ВХОД [CONTOSO\MyGroup] ИЗ WINDOWS;
SELECT SUSER_ID ('CONTOSO\MyUser'), SUSER_SID ('CONTOSO\MyUser')
даст вам
NULL, CONTOSO\MyUser
потому что CONTOSO\MyUser не находится в sys.server_principals, но находится в A/D