【问题标题】:Setting 'Select' Permission on 100+ tables in a database对数据库中的 100 多个表设置“选择”权限
【发布时间】:2014-12-04 23:08:57
【问题描述】:

我在 db 中的某些表出现“选择权限被拒绝”错误。

在 MS SQL Server 2012 中,对 1 个表设置“选择”权限很容易。我只需右键单击表格 > 属性 > 权限 > 选择用户/角色,然后在下面的“显式”选项卡中勾选“选择”权限。

但我想为 100 多张桌子这样做。有没有更好的方法?

【问题讨论】:

    标签: sql-server-2012


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您应该从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
      

      【讨论】:

        【解决方案3】:

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

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          • 2012-11-13
          • 2013-09-14
          • 2010-11-23
          • 2010-11-24
          相关资源
          最近更新 更多