我正在寻找对SQL Server中的用户/组禁用对sys.tables
/的访问的最佳方法Information Schema
。
它显示了一种如何拒绝访问的方法,[sys].[something]
如下所示:
DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
GO
DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
GO
但是没有办法如何禁用对的访问Information Schema
:
DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
这似乎行不通。
如何禁用对information_schema的访问?
还有一种更简单的方法来禁用对所有sys
/的访问information_schema
吗?
更新: 实际上我不能同时运行以下语句:
DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO
我试图在用户所在的特定数据库上运行它们,并且还尝试了“主”数据库。
我仍然可以运行:
SELECT * from
INFORMATION_SCHEMA.TABLES
->仍然返回结果
SELECT * from
sys.TABLES
->没有结果了
包含SCHEMA::
在查询中使得可以创建安全对象
DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO
但是现在我仍然可以从数据库中选择所有信息。
我在Management Studio 2008的用户“属性”窗口中查看了“ Securables”标签,如下所示:
确实阻止sys.tables选择的条目
模式:sys,名称:表,类型:视图
sys.tables的权限:Permission:Select,Grantor:dbo,Deny被选中
不阻止任何选择的条目
模式:,名称:INFORMATION_SCHEMA,类型:模式
INFORMATION_SCHEMA的权限:Permission:Select,Grantor:dbo,Deny未选中(我尝试进行检查,但没有机会。)
权限:选择,授予者:INFORMATION_SCHEMA,拒绝已选中
我试图通过GUI设置权限,但是随后出现了同样的错误,即只能在主数据库上设置权限。但是我没有将用户/登录添加到主数据库安全性中。
解:
我可以做的唯一途径deny
的工作information_schema
是将用户添加到主数据库,并运行deny select
在主:
DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO
就像这段代码一样,它只能对单个表执行。