服务器代理队列的激活存储过程的服务器权限

And*_*ykh 5 security sql-server sql-server-2012

我有一个查询sys.dm_exec_requests视图的存储过程。在存储过程中,视图只返回一行,而存储过程需要查看所有行。视图上的MSDN文章说返回什么取决于用户权限:

如果用户在服务器上有 VIEW SERVER STATE 权限,用户将看到 SQL Server 实例上所有正在执行的会话;否则,用户将只能看到当前会话。

存储过程实际上是一个broker队列的激活存储过程:

CREATE QUEUE test_queue
  WITH 
  STATUS = ON,
  RETENTION = OFF ,
  ACTIVATION (
    STATUS = ON,
    PROCEDURE_NAME = test_procedure,
    MAX_QUEUE_READERS = 1, 
    EXECUTE AS SELF ),
POISON_MESSAGE_HANDLING (STATUS = ON) 
ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

当我阅读MSDN文章时,我改变了

EXECUTE AS SELF
Run Code Online (Sandbox Code Playgroud)

EXECUTE AS 'dbo'
Run Code Online (Sandbox Code Playgroud)

这没有任何区别。sys.dm_exec_requests仍然会返回一行。

我也试着做

EXECUTE AS OWNER
Run Code Online (Sandbox Code Playgroud)

这也没什么区别。据我了解,存储过程所有者是谁创建的,也就是我。由于我处于系统管理员角色中,应该可以正常工作,但事实并非如此。我将不胜感激任何故障排除提示。

特别是我想知道如何列出给定用户的服务器权限,以便我可以根据文章检查它们是否包含“查看服务器状态”权限。

令人困惑的部分是我所理解的用户是在数据库级别,所以我不清楚它如何获得服务器权限。如果你能澄清这一点,那就太好了。

Rem*_*anu 6

有关如何正确正确签署已激活过程以便它可以利用已激活过程的 VIEW SERVER STATE 特权的示例,请参阅签署已激活过程。步骤是:

  • 检查程序代码以确保您信任它
  • 将过程更改为具有 EXECUTE AS OWNER 子句(没有EXECUTE AS,即使模块已签名,由于 Service Broker 执行激活过程的方式,主体也无法访问主机数据库之外的内容)
  • 在您的应用程序数据库中使用私钥创建证书
  • 使用您创建的证书的私钥签署程序
  • 删除证书的私钥(以防止它再次被使用)
  • 将证书复制到主数据库中
  • 从证书创建登录
  • 将 AUTHENTICATE SERVER 授予证书派生登录
  • 向证书派生登录授予该过程所需的任何额外权限(例如查看服务器状态)