设置'选择'数据库中100多个表的权限

时间:2014-12-04 23:08:57

标签: sql-server-2012

我得到了“拒绝选择权限”#39;数据库中某些表的错误。

在MS SQL Server 2012中,设置'选择' 1桌上的许可很容易。我只需右键点击表格>属性>权限>选择用户/角色并勾选“选择”#39;明确'中的权限下面的标签。

但是我想要超过100张桌子。有没有更好的方法呢?

3 个答案:

答案 0 :(得分:1)

没有while循环:

DECLARE @Sql NVARCHAR(MAX)
SET @Sql = ''

select @Sql = @Sql +
    'grant select on '+
   s.name + '.' + o.name + ' to [domain\user] go' + CHAR(10)
from sys.objects o
join sys.schemas s on o.schema_id = s.schema_id
where o.type = 'U' and s.name = 'dbo'

PRINT @Sql

答案 1 :(得分:0)

您应该从sys.objects获取所需的表列表,然后在每个表上循环并执行grant。这是一个例子:

select 
   s.name + '.' + o.name schemaQualifiedTableName, 
   row_number() over (order by o.name) Id 
into #tables
from sys.objects o
join sys.schemas s on o.schema_id = s.schema_id
where o.type = 'U' and s.name = 'dbo'

declare @counter int 
set @counter = 1

while exists(select * from #tables where id = @counter)
begin

    declare @sql as varchar(4000)

    select @sql = 'grant select on ' + schemaQualifiedTableName + ' to [domain\user] go' from #tables where id = @counter

    print @sql
    --exec (@sql)

    set @counter = @counter + 1
end

答案 2 :(得分:0)

快速和肮脏的方式是创建一个新的数据库角色并授予它选择dbo squema(假设这些表在dbo方案中)。当然,它不是最好的安全实践,更好的做法是将该角色授予它所需的每个表,然后将用户包括在角色中。 在进入任何解决方案之前,您应该定义要保留的安全级别。

希望这有帮助。