MSDN文档针对SUSER_SNAME函数说明:
从用户的安全标识号(SID)返回登录标识名称。
更重要的是,它代表了SUSER_NAME功能:
返回用户的登录标识名称。
尽管如此,当我执行以下SQL语句时,我得到相同的结果:
SELECT SUSER_NAME();
SELECT SUSER_SNAME();
那么,有什么区别,我应该使用哪一个?是否有一种情况我应该使用一种而不是另一种?
请建议,
提前致谢:)
答案 0 :(得分:30)
如果在没有参数的情况下调用函数,它们将返回相同的值。但他们确实采取了不同的论点:
varbinary(85) SID
作为参数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
中