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;

 

image


Source :
https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-triggers-transact-sql?view=sql-server-ver15

Les commentaires sont fermés.