截断表的权限
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:将所需的最低权限是 更改表名。截断表 权限默认为表 所有者,系统管理员的成员已修复 服务器角色,以及 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/…以上是关于截断表的权限的主要内容,如果未能解决你的问题,请参考以下文章