SQL Server用户名功能

问题描述:

考虑一下这个T-SQL:SQL Server用户名功能

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'。

+0

MSDN的例子用途EXECUTE AS LOGIN,这是你在做什么很大的不同。您必须**完全理解模拟范围和身份验证器的概念才能使用EXECUTE AS,特别是按照您的计划采用侵略性方式。阅读http://msdn.microsoft.com/en-us/library/ms188304.aspx –

更新:你需要在这里ORIGINAL_LOGIN FN太

原文:

之后,没有匹配的系统级用户。因此,它不能解析数据库级的SID,所以单纯从sys.database_principals

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

我不知道这是由设计返回SID,但它说明了其中的数字从何而来。不出所料,其余低于

Notes作为解释:

  • 你会得到USER_NAME(),因为你用系统管理员权限登录DBO。使用db级用户功能时,每个使用“sysadmin”的用户都是dbo。

  • 改变用户上下文后,分贝级用户功能解析到数据库用户上下文

  • 对于系统级用户的功能,你会得到你所使用的登录前

这里只是一个猜测,但在我看来,第一个选择正在以当前登录的用户的身份运行,并且在第二个选择中,然后告诉sql server执行为新创建的用户。

+0

是的,正好....所以什么函数将返回第一种情况下的'original_user'和第二种情况下'my_test_user'? – Clyde

没有登录用户都被专门用于服务代理安全性(远程服务绑定)或用于代码签名的一个特例。他们代表身份,而不是模仿。不要使用未经EXECUTE AS登录的用户。你会碰到的所有排序的边缘情况,因为他们明确地没有一个用户登录映射和几乎无处不在的映射预期。