【问题标题】:Grant SELECT, UPDATE, INSERT, DELETE to all tables except 1 (or more) in SQL Server 2005将 SELECT、UPDATE、INSERT、DELETE 授予 SQL Server 2005 中除 1 个(或更多)之外的所有表
【发布时间】:2011-03-27 18:27:53
【问题描述】:

我拥有的用户应该有权访问数据库中的所有表 - SELECT、INSERT、UPDATE、DELETE 和 EXECUTE(要归咎于 ASP 代码:-P),但 1 个表除外,例如users.

当授予db_datareaderdb_datawriter 时,这将授予他们对所有内容的完全访问权限,并且删除users 表上的DELETE 权限将不起作用。

有超过 60 个表,并且正在寻找一种比使用 SSMS 更快的方法来遍历每个表并执行此操作。

我该怎么做呢?

【问题讨论】:

    标签: sql-server-2005 security roles


    【解决方案1】:

    您可以使用 hacky 游标和 sp_executeSQL(GRANT 不能采用变量表名)

    declare ctable cursor for 
        select Name from sysobjects where type = 'u'
    
    declare @Name sysname
    declare @ExecSQL nvarchar(512)
    
    open ctable
    fetch next FROM ctable into @Name
    
    while (@@FETCH_STATUS = 0)
        begin
            if (@Name <> 'MyTableToExclude')
            BEGIN
                SET @ExecSQL = 'grant SELECT on ' + @Name + ' to PUBLIC'
                EXEC sp_executesql @ExecSQL
    

    ...等

            END
            fetch next FROM ctable into @Name
        end
    close ctable
    deallocate ctable
    

    次要...请注意,您不能在表上授予 exec ;)

    【讨论】:

      【解决方案2】:

      您可以明确拒绝应该优先的权限。语法是

      deny delete on dbo.users to username
      

      【讨论】:

      • 所以我可以添加db_datareader和db_datawriter,然后分别排除这个特定表的权限,应该没问题吧?
      • 是的。来自 MSDN db_datawriter fixed database role can add, delete, or change data in all user tables. 因此,如果您减去该表上的权限,您最终应该得到您需要的集合。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2014-05-06
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多