截断表的权限

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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/…

以上是关于截断表的权限的主要内容,如果未能解决你的问题,请参考以下文章

截断所有 MySql 表的 shell 脚本

用于截断和重新填充表的 PLSQL 过程

在 Redshift 中更新整个表的正确方法,删除表 + 创建表与截断 + 插入表

MySQL表 - 截断或不截断?

审计截断和丢弃

MYSQL 清空表和截断表