截断表的权限

时间:2011-01-19 12:08:22

标签: sql-server database-permissions

为了能够截断表格,我需要在MSSQL中授予用户哪些权限?

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

5 个答案:

答案 0 :(得分:70)

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

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

答案 1 :(得分:8)

  

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

Source

答案 2 :(得分:8)

您可以创建存储过程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

答案 3 :(得分:1)

不要抓住,隐藏......

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。

答案 4 :(得分:-2)

您可以使用execute as owner创建一个存储过程,只对一个表或对任何表的存储过程执行:

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;