Вопрос по sql-server, tsql, sql – T-SQL: SUSER_SNAME против SUSER_NAME?

27

Документация MSDN говорит дляSUSER_SNAME функция:

Returns the login identification name from a user's security identification number (SID).

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

Returns the login identification name of the user.

Тем не менее, когда я выполняю следующие операторы SQL, я получаюthe same result:

<code>SELECT SUSER_NAME();
SELECT SUSER_SNAME();
</code>

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

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

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

Ваш Ответ

2   ответа
29

Если вы вызываете функцию без аргумента, они оба возвращают одно и то же значение. Но они принимают разные аргументы:

  • SUSER_SNAME() takes the varbinary(85) SID of a login as argument
  • SUSER_NAME() takes the integer principal_id of a login

Вы можете проверить это как:

select  suser_name(principal_id)
,       suser_name(sid)
,       suser_sname(principal_id)
,       suser_sname(sid)
from    sys.server_principals 
where   name = suser_name()

Только первый и последний столбец будут возвращать ненулевые значения.

@ MohammedA.Fadil: Вы вошли в систему как sa, когда увидели этот результат? Я вижу Principal_id = SID для встроенных принципалов сервера.
Я выполнил предоставленное вами заявление, и только третий столбец был пустым, похожеSUSER_NAME принимает обаprincipal_id а такжеsid, Кстати, я использую SQL Server 2012, если это имеет значение. Mohammed A. Fadil
Я использую SQL Server 2012 с пакетом обновления 1 (SP1), и у меня тот же результат, который описал Andomar.
@ MohammedA.Fadil: Странно, я тоже использую 2012 год, а второй и третий столбцыnull, Там может быть угловой случай, когдаcast(sid as int) равноprincipal_idно это маловероятно
Я думаю, я понял, почему Мухаммед видел меньше NULL. Попробуйте этот запрос:select sid,principal_id, CONVERT(int,sid) SidConverted , suser_name(principal_id) NamePid , suser_name(sid) NameSid , suser_sname(principal_id) SnamePid , suser_sname(sid) SnameSid from sys.server_principals , Всякий раз, когда Principal_id и SidConverted равны, NameSid будет иметь значение. Я думаю, при использованииsuser_name(sid)sid косвенно преобразуется в int.
0

SUSER_NAME () вернет имя, связанное с sid, который существует в sys.server_principals. Sid должен существовать в sys.server_principals.

SUSER_SNAME () может сделать это, но также может вернуть sid имени входа, если имя входа является членом группы активных каталогов.

Так что если у вас есть [CONTOSO \ MyGroup] в Active Directory и в этой группе есть один пользователь [CONTOSO \ MyUser]

И вы добавляете эту группу в SQL Server: СОЗДАТЬ ЛОГИН [CONTOSO \ MyGroup] ИЗ WINDOWS;

ВЫБЕРИТЕ SUSER_ID («CONTOSO \ MyUser»), SUSER_SID («CONTOSO \ MyUser»)

дам тебе NULL, CONTOSO \ MyUser потому что CONTOSO \ MyUser не находится в sys.server_principals, но находится в A / D

Похожие вопросы