可以通过这种方式模拟问题:
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数据库用户自己的逻辑没有服务器权限(即使管理员登录有)。但接下来呢?
我试过了:
所以看来我被迫创建新的服务器登录。我很有意思,可能还有其他方法让WITH EXECUTE AS在dbo用户/管理员登录权限下工作?
答案 0 :(得分:2)
您需要使用代码签名。这不是问题,因为您应该使用代码签名来开始授予程序权限......正确的顺序是:
有关示例,请参阅Signing an activate procedure。
请注意,在开发过程中,代码签名可能很麻烦,因为在每次更改之后,您必须重新签署该过程。出于开发目的,请不要在签名后立即删除私钥,因此可以重复使用。