我得到了“拒绝选择权限”#39;数据库中某些表的错误。
在MS SQL Server 2012中,设置'选择' 1桌上的许可很容易。我只需右键点击表格>属性>权限>选择用户/角色并勾选“选择”#39;明确'中的权限下面的标签。
但是我想要超过100张桌子。有没有更好的方法呢?
答案 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方案中)。当然,它不是最好的安全实践,更好的做法是将该角色授予它所需的每个表,然后将用户包括在角色中。 在进入任何解决方案之前,您应该定义要保留的安全级别。
希望这有帮助。