为了能够截断表,我需要在 MSSQL 中授予用户什么权限?
我正在尝试授予最小权限集,但我不能使用 DELETE,因为表非常大,我希望操作快速。
为了能够截断表,我需要在 MSSQL 中授予用户什么权限?
我正在尝试授予最小权限集,但我不能使用 DELETE,因为表非常大,我希望操作快速。
您需要 ALTER 权限:请参阅此处的权限部分。
请注意,您还可以将存储过程与 EXECUTE AS 一起使用,这样运行存储过程的用户甚至不需要被授予 ALTER 权限。
您可以创建一个存储过程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
所需的最低权限是对 table_name 的 ALTER。TRUNCATE TABLE 权限默认授予表所有者、sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色,并且不可转让。但是,您可以将 TRUNCATE TABLE 语句合并到模块(例如存储过程)中,并使用 EXECUTE AS 子句授予模块适当的权限。有关更多信息,请参阅使用 EXECUTE AS 创建自定义权限集。
不要授予,隐藏...
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。
您可以创建一个以所有者身份执行的存储过程,仅对一个表或对任何表的存储过程:
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;