SQL以userA身份执行AS userA vs Login

时间:2018-01-20 09:07:49

标签: sql-server tsql permissions

我有一个禁止userA更新它的tableA。 (userA是数据库用户)

DENY UPDATE ON tableA TO userA;

当我使用Window Authentication登录时,我使用以下查询更新tableA。

[查询]:

EXECUTE AS USER = 'userA';
GO
update tableA set colA='0001' where id=1;
GO 
REVERT;

[信息]:

  

对象上的UPDATE权限被拒绝   ' tableA',数据库' DW',架构' dbo'。

====>这是我的预期结果。

但是,当我更改为登录时,用户A'使用SQL Server身份验证。

[查询]:

update tableA set colA='0001' where id=1

====>它允许更新!它应该阻止更新,对吗?我可以知道它为什么不阻止它吗?我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果 login userAsysadmin服务器角色的成员,则可能会发生这种情况。

要获取此登录的实际行为,您应该模拟登录而不是用户:

EXECUTE AS LOGIN='userA'

当您模拟用户时,仅考虑显式授予用户的权限(在当前数据库中)。模拟登录时,还会考虑服务器级权限。

如果登录是sysadmin服务器角色的成员,则不再验证权限(包括任何显式DENY)。根据{{​​3}},“DENY不适用于对象所有者或sysadmin固定服务器角色的成员”。