考虑这个 T-SQL:
CREATE USER my_test_user WITHOUT LOGIN;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
我正在考虑使用这些帐户WITHOUT LOGIN
进行审核。基本上,我的“获取数据库连接”代码返回一个已执行 EXECUTE AS USER...WITH NO REVERT
的连接。
问题是我无法从这些用户名函数中获得一致的结果。两行输出为:
dbo dbo original_user original_user original_user my_test_user my_test_user S-1-9-3-XXXXX.. S-1-9-3-XXXXX.. S-1-9-3-XXXXX..
USER
函数在 'EXECUTE AS'
之后生成正确的输出,但在此之前它们显示 dbo 而不是用户名
SUSER
函数正好相反 - 它们最初是正确的,但在模拟之后它们会显示某种 ID
SUSER_SNAME 的 MSDN 文档明确给出一个应该起作用的示例。
更新:我正在寻找一个函数,该函数将在第一种情况下生成“original_user”,在第二种情况下生成“my_test_user”。
最佳答案
更新:您需要 ORIGINAL_LOGIN fn 也在这里
原文:
之后就没有匹配的系统级用户了。因此,它无法解析数据库级别的 sid,因此它只是从 sys.database_principals 返回 sid。
CREATE USER my_test_user WITHOUT LOGIN;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name(),
SUSER_SID();
SELECT * FROM sys.database_principals WHERE sid = SUSER_SID();
我不知道这是否是设计使然,但它解释了这个数字的来源。其余部分如预期,如下所述
注释:
您将获得 USER_NAME() 的 dbo,因为您是使用系统管理员权限登录的。使用数据库级别用户功能时,具有“sysadmin”的每个人都是 dbo。
更改用户上下文后,数据库级用户函数解析为数据库用户上下文
对于系统级用户功能,您将获得之前使用的登录名
关于SQL Server 用户名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579025/