我有一个用户,我使用以下方法授予了对凭据的授予访问权限:
GRANT ALTER ANY CREDENTIAL TO userA
当我用该用户登录时,以下内容将返回我的数据
SELECT * FROM sys.credentials
我可以看到我具有SERVER级别的权限。这可以通过执行来验证
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
使用另一个用户,例如userB,我通过执行
GRANT IMPERSONATE ON USER::userA TO userB
在存储过程中,以用户B身份登录时,将上下文切换到用户A
EXECUTE AS user = 'userA'
SELECT user_name() AS ContextUserName
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
SELECT * FROM sys.credentials
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
不会返回我“ ALTER ANY CREDENTIAL”权限。
SELECT * FROM sys.credentials
没有给我任何价值。
SELECT user_name()
返回给我userA但是。
我有什么想念的吗?为什么我不能像userA那样从sys.credentials中获取数据?
谢谢!
问题可能在于,这EXECUTE AS
仅是向UserB授予您正在执行的数据库上的UserA的权限,而不是授予服务器上给定的权限。这就是为什么SELECT user_name()
显示UserA,但SELECT * FROM fn_my_permissions (NULL, 'SERVER')
不显示UserA的权限,而是UserB的权限的原因。
Microsoft文件:
“ EXECUTE AS(Transact-SQL) ”模拟的范围仅限于当前数据库。到数据库用户的上下文切换不会继承该用户的服务器级权限。
sys.fn_my_permissions “SELECT * FROM fn_my_permissions(NULL, 'SERVER');
返回服务器上调用者的有效权限列表。”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句