REVOKE数据库级别对象级别的DENY VIEW DEFINITION

时间:2015-07-29 11:55:33

标签: sql sql-server tsql security sql-server-2008-r2

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:)

1 个答案:

答案 0 :(得分:3)

请注意DENYREVOKE是不同的事情。 DENY明确拒绝指定的权限,而REVOKE删除之前授予的先前GRANTDENY。如果确切的指定权限尚不存在,则REVOKE无效。您的第一个REVOKE无效,因为您从未在对象级别授予权限

如果存在冲突的GRANTDENY权限,则DENY优先。如果您选择在更高级别授予VIEW DEFINITION,则必须对特定对象例外使用DENY,或者在对象级别使用GRANT权限仅对所需对象使用VIEW DEFINITION

要避免这种情况并减少维护,您可以在架构级别授予VIEW DEFINITION并在不同架构中创建不希望GRANT启用的过滤器。使用此方法不会继承DENY,您可以完全避免DENY。就个人而言,我认为最好尽可能避免{{1}}。