MSDN 文档说明了SUSER_SNAME函数:
从用户的安全标识号 (SID) 返回登录标识名称。
此外,它对SUSER_NAME函数说:
返回用户的登录标识名。
尽管如此,当我执行以下 SQL 语句时,我得到了相同的结果:
SELECT SUSER_NAME();
SELECT SUSER_SNAME();
那么,有什么区别,我应该使用哪一个?有没有一种情况我应该使用一种而不是另一种?
请指教,
提前致谢 :)
MSDN 文档说明了SUSER_SNAME函数:
从用户的安全标识号 (SID) 返回登录标识名称。
此外,它对SUSER_NAME函数说:
返回用户的登录标识名。
尽管如此,当我执行以下 SQL 语句时,我得到了相同的结果:
SELECT SUSER_NAME();
SELECT SUSER_SNAME();
那么,有什么区别,我应该使用哪一个?有没有一种情况我应该使用一种而不是另一种?
请指教,
提前致谢 :)
如果您在没有参数的情况下调用该函数,它们都将返回相同的值。但他们确实采取了不同的论点:
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()
只有第一列和最后一列将返回非空值。
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