43

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

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

4

5 回答 5

74

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

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

于 2011-01-19T12:10:42.637 回答
9

您可以创建一个存储过程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
于 2011-01-19T12:34:46.107 回答
8

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

来源

于 2011-01-19T12:12:12.333 回答
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。

于 2011-01-19T12:16:16.987 回答
-2

您可以创建一个以所有者身份执行的存储过程,仅对一个表或对任何表的存储过程:

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;
于 2014-07-18T20:19:25.037 回答