我有以下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的撤销是否对其他用户有任何副作用?
答案 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等)中