【问题标题】:How to Revoke SELECT Permission for system_views To public如何撤销 system_views 的 SELECT 权限公开
【发布时间】:2009-03-10 20:00:24
【问题描述】:

我有以下 T-SQL 来显示授予我的 SQL Server 2005 上的主体的所有权限:

select dp.NAME AS principal_name, --1
  dp.type_desc AS principal_type_desc, --2
  o.NAME AS object_name, --3
  p.permission_name, --4
  p.state_desc AS permission_state_desc --5
from    sys.database_permissions p
  left    OUTER JOIN sys.all_objects o
  on     p.major_id = o.OBJECT_ID
  inner   JOIN sys.database_principals dp
  on     p.grantee_principal_id = dp.principal_id
order by principal_name, object_name

结果显示 public 并授予 SELECT:

 1      2             3            4      5
 ...
 public DATABASE_ROLE system_views SELECT GRANT
 ....

我认为 object_name system_views 适用于我的数据库 Views|system_views 文件夹中的所有视图。我尝试了以下 T-SQL(只是为了看看它是否再次被 GRANT 工作):

GRANT SELECT ON system_views TO public

我收到错误“找不到对象 'system_views',因为它不存在或您没有权限”。我确实以 sa 身份连接 SQL 服务器。

我的问题是如何为公共(用户或主体?)撤销对 system_views 的 SELECT 权限,并在必要时回滚权限。第二个问题是system_views for public的撤销对其他用户是否有副作用?

【问题讨论】:

    标签: sql-server sql-server-2005 tsql


    【解决方案1】:

    没有理由撤销查看系统视图的权限。用户只能看到他们已经有权访问的对象,因此他们已经知道这些对象存在。

    如果您想授予用户查看数据库中所有对象的权限,请授予他们查看架构或数据库的定义。

    【讨论】:

      【解决方案2】:

      从 sys.system_views 中选择 *

      公众对其中任何一个有 VIEW DEFINITION 吗?

      我强烈建议不要乱搞这些。

      你可以

      DENY VIEW DEFINITION ON SCHEMA::DBO TO PUBLIC
      

      【讨论】:

        【解决方案3】:

        public 是一个“special”角色。不要惹它。 例如,默认情况下,每个用户都是公共成员。

        Metadata visibility 实际上决定了用户看到的内容。因此,即使有人使用SELECT * FROM sys.columns,他们也只会看到他们拥有权限的对象的列。没有其他权限 = 只有系统视图列的信息。

        如果你这样做,你可能会破坏一些东西,尤其是在 SSMS 或直接访问客户端(Access、Excel 等)中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-03
          • 1970-01-01
          • 2018-04-24
          • 2011-10-19
          • 2016-06-05
          • 2016-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多