Answers:
查找此信息的最佳位置是在线书籍。TRUNCATE TABLE
此处的文章指示:
所需的最低权限为table_name的ALTER。默认情况下,表所有者,sysadmin固定服务器角色的成员以及db_owner和db_ddladmin固定数据库角色的TRUNCATE TABLE权限是不可转让的。但是,您可以将TRUNCATE TABLE语句合并到模块(例如存储过程)中,并使用EXECUTE AS子句为模块授予适当的权限。
因此,ALTER是所需的最低权限。您可以以DB Owner的身份获得,也可以以DB_DDLAdmin的身份获得。或者只是授予变更。
如果您考虑截断的作用及其工作方式,这是有道理的,这是一个非常“严谨”的命令,可以清空数据表并快速进行处理。
根据BOL中的此参考资料:
所需的最低权限为table_name的ALTER。TRUNCATE TABLE权限默认授予表所有者,sysadmin固定服务器角色的成员以及db_owner和db_ddladmin固定数据库角色,并且不可转让。但是,您可以将TRUNCATE TABLE语句合并到模块(例如存储过程)中,并使用EXECUTE AS子句为模块授予适当的权限。
您可以创建一个存储过程,并仅以所有者身份对一个表执行存储过程,或者对任何表进行存储过程。在下一个代码中,存储过程将截断任何表而无需征求db_owner
或的许可:
USE [database name]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Yimy Orley Asprilla
-- Create date: Julio 16 de 2014
-- Description: Función para hacer TRUNCATE a una tabla.
-- =============================================
ALTER 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;
您可以创建一个存储过程,并仅以所有者身份对一个表执行存储过程,或者对任何表进行存储过程。在下一个代码中,存储过程将截断任何表,而无需授予db_owner或其他权限。此版本的SP中包含错误处理和SQL注入预防
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Se validan el parametro de entrada @strTabla para evitar un SQL inyección, Yimy Asprilla ******/
CREATE PROCEDURE [dbo].[spTruncate]
@strTabla VARCHAR(50)
WITH EXECUTE AS OWNER
AS
-- =============================================
-- Author: Yimy Asprilla
-- Create date: Julio 16 de 2014
-- Update: September 21 2017
-- Description: Función para hacer TRUNCATE a una tabla si ser owner de la tabla. con manejo de errores y SQL Inyection
-- =============================================
SET NOCOUNT ON
DECLARE @strSQL VARCHAR(500);
DECLARE @object_id int;
SET @object_id = OBJECT_ID(@strTabla);
BEGIN TRY
IF @object_id IS NOT NULL
BEGIN;
BEGIN TRANSACTION;
SET @strSQL = 'TRUNCATE TABLE [' + @strTabla + '];'
EXECUTE (@strSQL);
COMMIT TRANSACTION;
END;
ELSE
BEGIN;
PRINT N'La Tabla: ' + @strTabla + ' No existe';
END;
END TRY
BEGIN CATCH
-- se presento un error en la ejcución y s epresenta
PRINT N'Se presento el error: ';
SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
据我了解,截断不是您可以回滚的东西。因此,开始事务/提交事务是不必要的。
BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT
TRUNCATE TABLE
是DDL,而不是DML。