是否可以在“dbo用户/管理员登录”权限下运行“WITH EXECUTE AS”(需要查看服务器状态)?

时间:2014-02-10 12:05:57

标签: sql-server sql-server-2012

可以通过这种方式模拟问题:

DECLARE @C1 BIGINT,@C2 BIGINT;
PRINT SUSER_NAME()+ ' '+ USER_NAME();
SELECT @C1=transaction_id from sys.dm_tran_current_transaction (nolock)
PRINT @C1
EXECUTE AS USER = 'dbo';
PRINT SUSER_NAME()+ ' '+ USER_NAME();
SELECT @C2=transaction_id from sys.dm_tran_current_transaction (nolock)
PRINT @C2
REVERT;

从'Administrator'登录(db owner,链接到dbo用户)调用返回:

Administrator dbo
2209599
Administrator dbo
Msg 297, Level 16, State 1, Line 7
The user does not have permission to perform this action.

相同的用户但结果不同。为什么呢?

详细信息:

我有一个包含sys.dm_os_sys_info中的select的SP,因此该SP的调用者应具有VIEW SERVER STATE权限。

我已经使用“WITH EXECUTE AS OWNER”修改了SP标题。所有者是链接到“管理员”服务器登录的标准“dbo”数据库用户。管理员是sysadmin的成员并具有有效权限'VIEW SERVER STATE',但执行我修改过程会导致'用户无权执行此操作'错误...我看到DBO数据库用户自己的逻辑没有服务器权限(即使管理员登录有)。但接下来呢?

我试过了:

  1. 向DBO授予查看服务器状态 - 因为“dbo is”而无法正常工作 不是用户定义的服务器角色'错误。
  2. 创建链接到“管理员”的新用户“ServerStateViewer” - 由于“登录已经拥有不同用户名下的帐户”(因为据我所知 - dbo用户在数据库中退出)
  3. 创建新用户'ServerStateViewer'未链接到任何登录 - 不起作用,因为我无法向该用户添加任何服务器权限。
  4. WITH EXECUTE AS'Administrator' - 由于'管理员不是数据库用户'错误而无效。
  5. 所以看来我被迫创建新的服务器登录。我很有意思,可能还有其他方法让WITH EXECUTE AS在dbo用户/管理员登录权限下工作?

1 个答案:

答案 0 :(得分:2)

您需要使用代码签名。这不是问题,因为您应该使用代码签名来开始授予程序权限......正确的顺序是:

  • 检查程序代码以确保您信任它
  • 将过程更改为具有EXECUTE AS OWNER子句
  • 使用SP数据库中的私钥创建证书
  • 使用您创建的证书的私钥对该过程进行签名
  • 删除证书的私钥(以防止它再次被使用)
  • 将证书复制到主数据库
  • 从证书创建登录
  • 将AUTHENTICATE SERVER授予证书派生登录
  • 将程序所需的任何其他权限(例如VIEW SERVER STATE)授予证书派生登录

有关示例,请参阅Signing an activate procedure

请注意,在开发过程中,代码签名可能很麻烦,因为每次更改之后,您必须重新签署该过程。出于开发目的,请不要在签名后立即删除私钥,因此可以重复使用。