SQL Server 2008 R2环境:
我们有以下声明:
DENY VIEW DEFINITION TO Foo;
这在数据库级别上运行,因此它会拒绝数据库中所有对象的VIEW DEFINITION权限。
到目前为止很清楚。
如果对于该数据库中的一个对象,您仍然希望Foo用户能够查看定义吗?
我尝试在对象级别上撤消数据库级别DENY:
REVOKE VIEW DEFINITION ON OBJECT::[dbo].[storedProcFoo] FROM Foo;
用户仍然无法查看定义。
我试图在对象级别上恢复它:
GRANT VIEW DEFINITION ON OBJECT::[dbo].[storedProcFoo] TO Foo;
用户仍然无法查看定义。 (我知道我在数据库级别上有一个DENY,它优先,所以我真的不希望它像这样工作)
逻辑上应该有效: DENY VIEW DEF在数据库级别上, 然后在数据库中的几个特殊对象上撤消DENY。
我在这里缺少什么? 请不要告诉我必须为所有单个物品拒绝查看DEF:)
答案 0 :(得分:3)
请注意DENY
和REVOKE
是不同的事情。 DENY
明确拒绝指定的权限,而REVOKE
删除之前授予的先前GRANT
或DENY
。如果确切的指定权限尚不存在,则REVOKE
无效。您的第一个REVOKE无效,因为您从未在对象级别授予权限。
如果存在冲突的GRANT
和DENY
权限,则DENY
优先。如果您选择在更高级别授予VIEW DEFINITION
,则必须对特定对象例外使用DENY
,或者在对象级别使用GRANT
权限仅对所需对象使用VIEW DEFINITION
。
要避免这种情况并减少维护,您可以在架构级别授予VIEW DEFINITION
并在不同架构中创建不希望GRANT
启用的过滤器。使用此方法不会继承DENY
,您可以完全避免DENY。就个人而言,我认为最好尽可能避免{{1}}。