如何撤消system_views的SELECT权限公开

时间:2009-03-10 20:00:24

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

我有以下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

结果显示公共,已授予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',因为它不存在或您没有权限”。我将SQL服务器连接为sa。

我的问题是,如果必须,如何撤销对public(user或principal?)的system_views的SELECT权限和roll权限。第二个问题是,对公众的system_views的撤销是否对其他用户有任何副作用?

3 个答案:

答案 0 :(得分:1)

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

如果要授予用户查看数据库中所有对象的权限,请在架构或数据库上授予它们视图定义。

答案 1 :(得分:0)

从sys.system_views中选择*

公众是否对其中任何一个都有查看定义?

我强烈建议不要讨论这些问题。

你可以

DENY VIEW DEFINITION ON SCHEMA::DBO TO PUBLIC

答案 2 :(得分:0)

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

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

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