用于截断表的权限

我需要什么权限才能授予MSSQL中的用户,以便能够截断表?

我试图授予最小的一组权限,但我不能使用DELETE,因为表是非常大的,我希望操作很快。

您需要ALTER权限:请参阅此处的权限部分。

请注意,您也可以使用带有EXECUTE AS的存储过程,以便运行存储过程的用户不需要甚至被授予ALTER权限。

所需的最小权限是table_name上的ALTER。 TRUNCATE TABLE权限默认授予表所有者,sysadmin固定服务器angular色成员以及db_owner和db_ddladmin固定数据库angular色,并且不可转让。 但是,可以将TRUNCATE TABLE语句合并到模块(如存储过程)中,并使用EXECUTE AS子句向模块授予适当的权限。 有关更多信息,请参阅使用EXECUTE AS创build自定义权限集。

资源

您可以创build一个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 

不要赞美,隐藏…

 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无疑可以更好地从TRUNCATE TABLE中分离正常的DELETE

我没有试过这个…

编辑 :改为使用SET CONTEXT_INFO。

您可以使用作为所有者的execute来创build一个存储过程,以便只有一个表或一个存储过程到任何表:

 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; 
Interesting Posts