【发布时间】:2014-12-04 23:08:57
【问题描述】:
我在 db 中的某些表出现“选择权限被拒绝”错误。
在 MS SQL Server 2012 中,对 1 个表设置“选择”权限很容易。我只需右键单击表格 > 属性 > 权限 > 选择用户/角色,然后在下面的“显式”选项卡中勾选“选择”权限。
但我想为 100 多张桌子这样做。有没有更好的方法?
【问题讨论】:
标签: sql-server-2012
我在 db 中的某些表出现“选择权限被拒绝”错误。
在 MS SQL Server 2012 中,对 1 个表设置“选择”权限很容易。我只需右键单击表格 > 属性 > 权限 > 选择用户/角色,然后在下面的“显式”选项卡中勾选“选择”权限。
但我想为 100 多张桌子这样做。有没有更好的方法?
【问题讨论】:
标签: sql-server-2012
没有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
【讨论】:
您应该从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
【讨论】:
快速而肮脏的方法是创建一个新的数据库角色并将其选择授予 dbo squema(假设这些表在 dbo 方案中)。当然,这不是最佳的安全实践,更好的实践是将该角色授予它需要的每个表,然后将用户包括在该角色中。 在采用任何解决方案之前,您应该定义要保持的安全级别。
希望这会有所帮助。
【讨论】: