SQL Server 2008 - 仅授予用户对某些表和视图的访问权限

时间:2014-04-29 18:26:45

标签: sql-server sql-server-2008 permissions roles

我需要允许某些用户仅访问特定的视图和表。我到目前为止已经尝试过了

  • 创建了用户ex_user
  • 创建角色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的对象资源管理器中查看可用的视图和表

3 个答案:

答案 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;