我需要允许某些用户仅访问特定的视图和表。我到目前为止已经尝试过了
创建角色rviewonly
deny view definition to rviewonly;
然后我执行了这个sql
GRANT SELECT ON vwBI_PEOPLE TO rviewonly
它似乎有效,而且这个ex_user可以对它执行select命令,但是我在Management Studio中的视图列表中看不到这个vwBI_PEOPLE
。我必须为这个用户提供大约50个视图以及大约40个不同的表 - 我希望用户能够在Management Studio的对象资源管理器中查看可用的视图和表
答案 0 :(得分:1)
由于您已在角色/用户的数据库级别(未指定对象)拒绝view definition
,因此优先于您可能对单个对象进行的任何grant view definition on ...
。 Grant select on ...
还允许在该对象上进行视图定义,而无需指定grant view definition
。
我建议在数据库级别撤销view definition:
revoke view definition to rviewonly;
只需让您的grant select on
语句为您完成工作。运行上述撤销后,您不必再次重新运行它们。 view definiton
本身对于为用户/角色提供元数据访问权限是有益的,而不是数据。
请注意,任何deny
都会胜过grant
,包括您拒绝角色访问但授予用户访问权限的情况,反之亦然。
我刚刚在SQL Server 2008 R2开发框中验证了这一点。我不确定是否存在任何可能会改变您实例的此行为的设置。
答案 1 :(得分:0)
之前我有同样的问题。我,而不是使用角色,只是授予用户本身的选择权。这对于多个表权限授予非常方便:
SELECT 'GRANT SELECT ON '+name+' TO ex_user;'
from sysobjects
where name in (
'[Enter table]',
'[names here]',
'[in a list]',
'[to grant permissions]'
)
然后复制所有结果,将其放入查询中并运行它。如果您要授予访问权限的所有表都以相同的字母分组为前缀,则特别方便。
示例:如果您授予的所有表/视图都以“TST _”开头,您可以将上述查询的where子句更改为where name like 'TST_%'
。
答案 2 :(得分:0)
您需要将ex_user添加到rviewonly角色sp_addrolemember:
EXEC sp_addrolemember rviewonly, [ex_user];
然后使用revoke而不是拒绝视图定义到角色:
revoke view definition to rviewonly;