【问题标题】:Permissions for truncating a table截断表的权限
【发布时间】:2011-06-11 17:25:02
【问题描述】:

我需要在 MSSQL 中授予用户什么权限才能截断表?

我正在尝试授予最小权限集,但我不能使用 DELETE,因为表非常大,我希望操作快速。

【问题讨论】:

    标签: sql-server database-permissions


    【解决方案1】:

    您需要 ALTER 权限:请参阅 权限 部分 here

    请注意,您还可以将存储过程与 EXECUTE AS 一起使用,这样运行存储过程的用户甚至不需要被授予 ALTER 权限。

    【讨论】:

    • 这个答案不仅是正确的,而且通过指向文档来“教人钓鱼”,以便 OP 将来可以找到这样的答案。为什么投反对票?
    • @Ben - 我怀疑是因为 OP 在发布问题后大约一纳秒发布了这个答案。我没有投反对票,因为常见问题解答允许这样做。
    • @Martin - 这不是一纳秒。那是 2 分钟 - 这就是我找到答案所用的时间。
    • tldr:将 上的更改授予
    【解决方案2】:

    所需的最低权限是 更改表名。截断表 权限默认为表 所有者,系统管理员的成员已修复 服务器角色,以及 db_owner 和 db_ddladmin 固定数据库角色,以及 不可转让。但是,您可以 合并截断表 模块中的语句,例如 存储过程,并授予 对模块的适当权限 使用 EXECUTE AS 子句。更多 信息,请参阅使用 EXECUTE AS 来 创建自定义权限集。

    Source

    【讨论】:

      【解决方案3】:

      不要授予,隐藏...

      CREATE TRIGGER TRG_MyTable_Foo 
      WITH EXECUTE AS OWNER
      INSTEAD OF DELETE
      AS
      IF CONTEXT_INFO() = 0x9999
      BEGIN
          TRUNCATE TABLE MyTable
          SET CONTEXT_INFO 0x00
      END
      GO
      
      SET CONTEXT_INFO 0x9999
      DELETE MyTable WHERE 1=0
      

      SET CONTEXT_INFO 可能是毫无疑问更好将普通的DELETE与TRUNCATE TABLE分开

      这个我没试过……

      编辑:改为使用 SET CONTEXT_INFO。

      【讨论】:

      • +1 我会说SET CONTEXT_INFO 是必须的,但要避免引起不愉快的惊喜!
      • -1 这将使命中零行的删除截断表。你通常是一个很好的回答者,但这是一个不可维护的黑客恕我直言。
      • @Andomar:是的,已更正。我没有充分考虑过,也没有足够快地更新我的答案
      【解决方案4】:

      可以创建存储过程with execute as owner

      create procedure dbo.TruncTable
      with execute as owner
      as
      truncate table TheTable
      go
      

      然后将执行权限授予需要截断该表的任何人:

      grant execute on TruncTable to TheUser
      

      现在TheUser 可以像这样截断表格:

      exec dbo.TruncTable
      

      【讨论】:

        【解决方案5】:

        您可以创建一个以所有者身份执行的存储过程,仅对一个表或对任何表的存储过程:

        CREATE PROCEDURE [dbo].[spTruncate]
            @nameTable varchar(60)  
            WITH EXECUTE AS OWNER
            AS
        
        SET NOCOUNT OFF;
        DECLARE @QUERY NVARCHAR(200);
        
        SET @QUERY = N'TRUNCATE TABLE ' + @nameTable + ';'
        
        EXECUTE sp_executesql @QUERY;
        

        【讨论】:

        • @Graeme,为什么这很危险?您和其他评论者都认为是,但我不确定为什么。
        • 嗨,@FoxDeploy-- 如果某些恶意用户使用 SQL 注入,比如这个-- DECLARE @nameTable VARCHAR(60) = 'SomeTable; DROP DATABASE YourDatabase; --'; EXECUTE dbo.spTruncate @nameTable; GO 更多:security.stackexchange.com/questions/128412/…
        猜你喜欢
        • 2017-10-16
        • 2012-11-18
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        相关资源
        最近更新 更多