Sql server 有没有可能得到;以“执行”的形式执行;在"下工作,;dbo用户/管理员登录”;权限(需要查看服务器状态)?

Sql server 有没有可能得到;以“执行”的形式执行;在"下工作,;dbo用户/管理员登录”;权限(需要查看服务器状态)?,sql-server,sql-server-2012,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=transactio

可以通过以下方式模拟该问题:

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;
从“管理员”登录(数据库所有者,链接到dbo用户)调用返回:

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

详细信息:

我有一个包含select from sys.dm_os_sys_info的SP,因此此SP的调用者应该具有查看服务器状态权限

我用“以所有者身份执行”修改了SP标头。所有者是链接到“管理员”服务器登录的标准“dbo”数据库用户。管理员是sysadmin的成员,具有“查看服务器状态”的有效权限,但执行我修改的过程会出现“用户没有执行此操作的权限”错误。。。我看到了这种逻辑,因为DBO数据库用户本身没有服务器权限(即使管理员登录有)。但是接下来呢

我试过:

  • 将视图服务器状态授予DBO-不工作,因为“DBO为” 不是用户定义的服务器角色错误
  • 创建链接到“管理员”的新用户“ServerStateViewer”-不起作用,因为“登录名已具有另一用户名下的帐户”(据我所知,dbo用户在dabatabse中退出)
  • 创建新用户“ServerStateViewer”未链接到任何登录-无法工作,因为我无法向该用户添加任何服务器权限
  • 以“管理员”身份执行-由于“管理员不是数据库用户”错误而不起作用

  • 看来我不得不创建新的服务器登录。我很感兴趣,也许还有其他方法可以在dbo用户/管理员登录权限下使用executeas

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

    • 检查程序代码以确保您信任它
    • 将过程更改为具有EXECUTE AS OWNER子句
    • 在SP的数据库中使用私钥创建证书
    • 使用您创建的证书的私钥对过程进行签名
    • 删除证书的私钥(以防止其再次被使用)
    • 将证书复制到主数据库中
    • 从证书创建登录名
    • 将身份验证服务器授予证书派生的登录名
    • 将过程所需的任何附加权限(例如查看服务器状态)授予证书派生登录
    有关示例,请参见


    请注意,在开发过程中,代码签名可能是一件痛苦的事情,因为在每更改一次后,您都必须对过程重新签名。出于开发目的,请勿在签名后立即删除私钥,以便可以重用。

    谁是数据库所有者?你呢?系统管理员?我相信SP的调用方(如您所述)与此无关。SP消除了向调用者授予一切的要求,所有权链接控制可以访问的内容。只要调用方可以执行它,那么SP中的所有内容都应该触发,只要它在自己的模式中调用对象。数据库所有者是建立模拟用户身份的人/人,因此基于数据库所有者,它可能会失败。@Ben:数据库所有者是管理员(sql server登录名为“管理员”);'“dbo”用户在我的数据库中链接到它。如果有任何调用者出现“管理员”、“YetAnotherMemberOfSysadminAndDbOwner”等调用者,则执行为所有者的我的SP将返回权限错误。您能建议我应该创建和测试哪种调用者吗?Remus,我还想请您解释一下为什么签名过程有效,为什么“只是”作为所有者执行不起作用?我文章第一行的链接提供了答案。
    Administrator dbo
    2209599
    Administrator dbo
    Msg 297, Level 16, State 1, Line 7
    The user does not have permission to perform this action.