T-SQL:SUSER_SNAME对SUSER_NAME?

时间:2012-05-13 07:03:30

标签: sql sql-server tsql

MSDN文档针对SUSER_SNAME函数说明:

  

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

更重要的是,它代表了SUSER_NAME功能:

  

返回用户的登录标识名称。

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

SELECT SUSER_NAME();
SELECT SUSER_SNAME();

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

请建议,

提前致谢:)

2 个答案:

答案 0 :(得分:30)

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

  • 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()

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

答案 1 :(得分:0)

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

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

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

然后将该组添加到SQL Server: 创建登录[CONTOSO \ MyGroup] FROM WINDOWS;

SELECT SUSER_ID('CONTOSO \ MyUser'),SUSER_SID('CONTOSO \ MyUser')

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