Подтвердить что ты не робот

T-SQL: SUSER_SNAME против SUSER_NAME?

В документации MSDN для функция SUSER_SNAME:

Возвращает имя идентификации входа из идентификационного номера безопасности пользователя (SID).

Более того, он говорит для функции SUSER_NAME:

Возвращает имя пользователя для входа в систему.

Тем не менее, когда я выполняю следующие инструкции SQL, я получаю тот же результат:

SELECT SUSER_NAME();
SELECT SUSER_SNAME();

Итак, каковы различия, и какой из них я должен использовать? Есть ли ситуация, которую я должен использовать, а другой?

Пожалуйста, совет,

Заранее спасибо:)

4b9b3361

Ответ 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