Temporarily disable a trigger on a data table
Rédigé par Sozezzo - - Aucun commentaire
Disable all triggers on a table, you do what you have to do, after enable only the triggers that have been disabled.
Step 1 : Disable all triggers
--#region Disable triggers DECLARE @triggers TABLE (SqlEnableTrigger NVARCHAR(MAX)); DECLARE @SchemaName VARCHAR(128) = 'mySchema'; – ** TO DO ** DECLARE @TableName VARCHAR(128) = 'mytable'; – ** TO DO ** DECLARE @SqlTrigger NVARCHAR(MAX); DELETE FROM @triggers; INSERT INTO @triggers (SqlEnableTrigger) SELECT 'ENABLE TRIGGER ' + QUOTENAME(sc.name) + N'.' + QUOTENAME(tg.name) + N' ON ' + QUOTENAME(sc.name) + N'.' + QUOTENAME(tb.name) + N';' AS SqlEnableTrigger FROM sys.schemas AS sc INNER JOIN sys.tables AS tb ON sc.schema_id = tb.schema_id RIGHT OUTER JOIN sys.triggers AS tg ON tb.object_id = tg.parent_id WHERE (sc.name =@SchemaName) AND (tb.name = @TableName) AND (tg.is_disabled = 0); SET @SqlTrigger = 'DISABLE TRIGGER ALL ON '+QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName); PRINT @SqlTrigger; EXEC (@SqlTrigger); --#endregion Disable triggers
Step 2: You do what you have to do.
Your code... to update, to delete, to insert, or everything you want.
Step 3 : Enable all triggers that have been disabled.
--#region Enaable triggers SET @SqlTrigger = ''; SELECT @SqlTrigger = @SqlTrigger + SqlEnableTrigger FROM @triggers; PRINT @SqlTrigger; EXEC (@SqlTrigger); --#endregion Enaable triggers
List all triggers, the SchemaName is empty when it is a DDL trigger
SELECT ISNULL(sc.name,'') AS SchemaName, ISNULL(tb.name,'(Database)') AS TableName, tg.name, tg.object_id, tg.parent_class, tg.parent_class_desc, tg.parent_id, tg.type, tg.type_desc, tg.create_date, tg.modify_date, tg.is_ms_shipped, tg.is_disabled, tg.is_not_for_replication, tg.is_instead_of_trigger, OBJECTPROPERTY(tg.object_id, 'ExecIsUpdateTrigger') AS isupdate, OBJECTPROPERTY(tg.object_id, 'ExecIsDeleteTrigger') AS isdelete, OBJECTPROPERTY(tg.object_id, 'ExecIsInsertTrigger') AS isinsert, OBJECTPROPERTY(tg.object_id, 'ExecIsAfterTrigger') AS isafter, OBJECTPROPERTY(tg.object_id, 'ExecIsInsteadOfTrigger') AS isinsteadof FROM sys.schemas AS sc INNER JOIN sys.tables AS tb ON sc.schema_id = tb.schema_id RIGHT OUTER JOIN sys.triggers AS tg ON tb.object_id = tg.parent_id;