【发布时间】:2011-06-11 17:25:02
【问题描述】:
我需要在 MSSQL 中授予用户什么权限才能截断表?
我正在尝试授予最小权限集,但我不能使用 DELETE,因为表非常大,我希望操作快速。
【问题讨论】:
标签: sql-server database-permissions
我需要在 MSSQL 中授予用户什么权限才能截断表?
我正在尝试授予最小权限集,但我不能使用 DELETE,因为表非常大,我希望操作快速。
【问题讨论】:
标签: sql-server database-permissions
您需要 ALTER 权限:请参阅 权限 部分 here。
请注意,您还可以将存储过程与 EXECUTE AS 一起使用,这样运行存储过程的用户甚至不需要被授予 ALTER 权限。
【讨论】:
所需的最低权限是 更改表名。截断表 权限默认为表 所有者,系统管理员的成员已修复 服务器角色,以及 db_owner 和 db_ddladmin 固定数据库角色,以及 不可转让。但是,您可以 合并截断表 模块中的语句,例如 存储过程,并授予 对模块的适当权限 使用 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。
【讨论】:
SET CONTEXT_INFO 是必须的,但要避免引起不愉快的惊喜!
可以创建存储过程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 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;
【讨论】:
DECLARE @nameTable VARCHAR(60) = 'SomeTable; DROP DATABASE YourDatabase; --'; EXECUTE dbo.spTruncate @nameTable; GO 更多:security.stackexchange.com/questions/128412/…