2011-01-19 143 views
38

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

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

回答

68

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

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

+1

不仅是这个答案是正确的,但没了“授人以渔”,所指向的文件等等这样的答案可以通过发现未来的OP。为什么downvote? – 2011-01-19 13:36:09

+2

@Ben - 我怀疑是因为OP发布这个问题后发布了这个答案约纳秒。我没有downvote,但常见问题解答允许这样做。 – 2011-01-19 14:25:15

+0

@Martin - 这不是一个纳秒。这是2分钟 - 这是我花了多长时间才找到答案。 – 2011-01-26 14:26:25

8

所需的最低权限是 对table_name的ALTER。 TRUNCATE TABLE 权限默认为表 所有者,sysadmin固定 服务器角色的成员,以及db_owner和 db_ddladmin固定数据库角色和 不可转让。但是,您可以使用EXECUTE AS子句在模块(例如 存储过程)中包含TRUNCATE TABLE语句 ,并将 授予 对模块 的适当权限。有关更多 信息,请参阅使用EXECUTE AS至 创建自定义权限集。

Source

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 可能 毫无疑问是更好分离从TRUNCATE TABLE

正常删除

我还没有试过这个...

编辑:更改为使用SET CONTEXT_INFO。

7

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

您可以使用exec创建存储过程UTE的所有者只有一个表或存储过程的任何表:

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;