29

MSDN 文档说明了SUSER_SNAME函数:

从用户的安全标识号 (SID) 返回登录标识名称。

此外,它对SUSER_NAME函数说:

返回用户的登录标识名。

尽管如此,当我执行以下 SQL 语句时,我得到了相同的结果

SELECT SUSER_NAME();
SELECT SUSER_SNAME();

那么,有什么区别,我应该使用哪一个?有没有一种情况我应该使用一种而不是另一种?

请指教,

提前致谢 :)

4

2 回答 2

32

如果您在没有参数的情况下调用该函数,它们都将返回相同的值。但他们确实采取了不同的论点:

  • SUSER_SNAME() 将varbinary(85) SID登录名作为参数
  • 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()

只有第一列和最后一列将返回非空值。

于 2012-05-13T08:51:15.553 回答
1

SUSER_NAME() 将返回与 sys.server_principals 中存在的 sid 关联的名称。sid 必须存在于 sys.server_principals 中。

SUSER_SNAME() 可以做到这一点,但如果登录名是活动目录组的成员,也可以返回登录名的 sid

因此,如果您在 Active Directory 中有 [CONTOSO\MyGroup] 并且该组有一个用户 [CONTOSO\MyUser]

然后将该组添加到 SQL Server: CREATE LOGIN [CONTOSO\MyGroup] FROM WINDOWS;

选择 SUSER_ID('CONTOSO\MyUser')、SUSER_SID('CONTOSO\MyUser')

会给你 NULL, CONTOSO\MyUser 因为 CONTOSO\MyUser 不在 sys.server_principals 但在 A/D

于 2017-11-13T18:44:40.173 回答