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

REVOKE database level DENY VIEW DEFINITION on object level

SQL Server 2008 R2环境:

我们有以下说法:

DENY VIEW DEFINITION TO Foo;

这在数据库级别上运行,因此它将拒绝对数据库中所有对象的 VIEW DEFINITION 权限。

到目前为止很清楚。

如果对于该数据库中的一个对象,您仍然希望 Foo 用户能够查看定义怎么办?

我试图在对象级别上取消数据库级别的拒绝:

REVOKE VIEW DEFINITION ON OBJECT::[dbo].[storedProcFoo] FROM Foo;

用户仍然无法查看定义。

我试图在对象级别重新授予它:

GRANT VIEW DEFINITION ON OBJECT::[dbo].[storedProcFoo] TO Foo;

用户仍然无法查看定义。 (我知道我在数据库级别有一个 DENY,它优先,所以我真的没想到它会像这样工作)

逻辑上它应该工作: 在数据库级别拒绝查看 DEF, 然后撤销对数据库中少数异常对象的拒绝。

我在这里错过了什么? 请不要告诉我我必须拒绝所有单个对象的 VIEW DEF :)

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

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

为避免这种情况并减少维护,您可以在模式级别授予 VIEW DEFINITION 并在不同的模式中创建您不希望 VIEW DEFINITION 的过程。 GRANT 不会通过这种方法继承,您可以完全避免拒绝。就个人而言,我认为最好尽可能避免使用 DENY