【问题标题】:REVOKE database level DENY VIEW DEFINITION on object levelREVOKE 数据库级别 DENY VIEW DEFINITION 在对象级别
【发布时间】:2015-07-29 11:55:33
【问题描述】:

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 在数据库级别, 然后 REVOKE 对数据库中少数异常对象的 DENY。

我在这里缺少什么? 请不要告诉我我必须拒绝查看所有单个对象的 DEF :)

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 2011-01-21
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多