Published on

January 10, 2019

Отключение триггеров в SQL Server для конкретных сеансов

Триггеры в SQL Server – это мощные инструменты, которые позволяют автоматизировать действия при наступлении определенных событий в вашей базе данных. Однако могут возникнуть ситуации, когда вы хотите отключить триггеры для конкретных сеансов, например, во время массовых вставок или операций загрузки данных. В этой статье мы рассмотрим различные способы отключения триггеров в SQL Server для конкретных сеансов.

Понимание “NOT FOR REPLICATION”

Прежде чем мы перейдем к методам отключения триггеров, давайте сначала разберемся в понятии “NOT FOR REPLICATION” в SQL Server. При создании триггеров у вас есть возможность указать “NOT FOR REPLICATION”. Это указывает, что триггеры не должны срабатывать, когда агенты репликации выполняют модификации данных в таблице. Эта подсказка также может использоваться для других объектов базы данных, таких как внешние ключи, идентификационные столбцы и проверочные ограничения.

Например, если у вас есть триггеры на таблице, установленные как “NOT FOR REPLICATION”, они будут срабатывать, когда обычный пользователь вставляет, обновляет или удаляет данные. Однако эти триггеры не будут срабатывать, когда агенты репликации выполняют те же модификации данных.

Отключение триггеров для конкретных сеансов

Теперь давайте рассмотрим методы отключения триггеров для конкретных сеансов в SQL Server.

Метод 1: Использование агента репликации

Один из способов отключить триггеры для конкретного сеанса – это войти в систему в качестве агента репликации. Войдя в систему в качестве агента репликации, триггеры, установленные как “NOT FOR REPLICATION”, не будут срабатывать для этого сеанса. Это может быть полезно, когда вы хотите загрузить данные в таблицы без срабатывания связанных действий, определенных в триггерах.

Вот пример того, как войти в систему в качестве агента репликации и вставить данные в таблицу без срабатывания триггеров:


-- Войти в систему в качестве агента репликации
-- Выполнить операторы INSERT без срабатывания связанных триггеров

Метод 2: Использование функции CONTEXT_INFO()

Другой способ отключить триггеры для конкретного сеанса – использовать функцию CONTEXT_INFO() в коде триггера. CONTEXT_INFO() позволяет сохранять информацию, специфичную для сеанса, которая может быть использована для условного выполнения кода триггера.

Вот пример использования функции CONTEXT_INFO() для отключения триггеров:


CREATE TRIGGER TR_INSEMPDETAILS ON Emp FOR INSERT AS
BEGIN
    SET NOCOUNT ON
    
    DECLARE @CONT_INFO VARBINARY(128)
    SELECT @CONT_INFO = CONTEXT_INFO()

    IF @CONT_INFO = 0x1256698456
        RETURN

    -- Здесь находится логика триггера
END

В этом примере код триггера будет выполняться только в том случае, если значение, сохраненное в CONTEXT_INFO(), соответствует указанному значению. Установив значение CONTEXT_INFO() на определенное значение перед вставкой данных в таблицу, вы можете эффективно отключить триггер для этого сеанса.

Метод 3: Использование утилиты BCP или BULK INSERT

Если вы загружаете данные из файла (например, .txt или .csv) в таблицу, вы можете использовать утилиту BCP или опции BULK INSERT для отключения триггеров. По умолчанию эти методы не срабатывают триггеры в процессе загрузки данных. Однако вы можете принудительно выполнить триггер, указав опцию “FIRE_TRIGGERS”.

Вот пример использования утилиты BCP с опцией “FIRE_TRIGGERS”:


BCP [database].dbo.table in datafile.txt -T -c -S"servername" -Uusername -Ppassword -h "FIRE_TRIGGERS"

А вот пример использования BULK INSERT с опцией “FIRE_TRIGGERS”:


BULK INSERT table FROM 'datafile.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRE_TRIGGERS)

Указав опцию “FIRE_TRIGGERS”, вы можете включить выполнение триггера в процессе загрузки данных.

Вывод

Отключение триггеров в SQL Server для конкретных сеансов может быть полезно в ситуациях, когда вы хотите выполнять массовые вставки или операции загрузки данных без срабатывания связанных действий, определенных в триггерах. Понимая концепцию “NOT FOR REPLICATION” и используя методы, такие как вход в систему в качестве агента репликации, использование функции CONTEXT_INFO() или использование утилиты BCP/BULK INSERT, вы можете эффективно отключить триггеры для конкретных сеансов в SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.