Вопрос

Довольно общий вопрос относительно триггеров в SQL Server 2005.

В каких ситуациях триггеры таблиц срабатывают, а в каких нет?

Любые примеры кода для демонстрации были бы великолепны.

Я пишу базы данных на основе аудита и просто хочу быть в курсе любых ситуаций, которые могут не сработать триггеры, которые я настроил для обновления, удаления и вставки в мои таблицы.

Пример того, что я имею в виду,

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);

Следующий оператор запускает триггер обновления только один раз.

Это было полезно?

Решение

Когда вы хотите, чтобы они открыли огонь?

CREATE TRIGGER AFTER ACTION

Это выполняется после действия (insert update delete) совершается. INSTEAD OF запускает триггер вместо действия.

Одна из самых больших проблем с триггерами заключается в том, что они срабатывают всякий раз, когда выполняется действие. даже если ни одна строка не затронута.Это не ошибка, и это может очень быстро сжечь вас, если вы не будете осторожны.

Кроме того, с триггерами вы будете использовать inserted и deleted столы.Обновленные строки перечислены в обоих.Это сбивает с толку многих людей, потому что они не привыкли думать о update как delete затем insert.

В документации MSDN на самом деле есть довольно подробное обсуждение того, когда срабатывают триггеры и какой эффект они оказывают. здесь.

Другие советы

В 2008 году вы можете использовать встроенный Сбор измененных данных

Также существует немало ситуаций, когда триггеры не срабатывают, например:

· Таблица удалена.

· Таблица усечена.

· Настройки вложенных и/или рекурсивных триггеров предотвращают срабатывание триггера.

· Данные загружаются массово, минуя триггеры.

Следующий оператор запускает триггер обновления только один раз.

Любой оператор типа действия запускает триггер только один раз, независимо от того, сколько строк затрагивается, триггеры должны быть написаны для обработки нескольких вставок/обновлений/удалений строк.

Если ваш триггер зависит от того, что во вставленных или удаленных псевдотаблицах одновременно находится только одна строка, он завершится неудачно.И что еще хуже, он не завершится ошибкой, он просто не повлияет на все строки, на которые вы хотите повлиять, что бы ни делал триггер.Не исправляйте это с помощью цикла или курсора в триггере, перейдите на логику, основанную на множествах.Курсор в триггере может привести к полной остановке всего вашего приложения, в то время как транзакция из 500 000 записей обрабатывает и блокирует таблицу на несколько часов.

Массовая вставка осуществляется через триггеры прохода, если вы не укажете их использование.Имейте это в виду, поскольку если вы позволите им обходить триггер, вам понадобится код, гарантирующий, что все, что происходит в триггере, также происходит после массовой вставки.Или вам нужно вызвать массовые вставки с опцией FIRE_TRIGGERS.

Я решил выделить из ссылки, которую Эрик опубликовал, ситуацию, в которой триггер не срабатывает:

Хотя оператор TRUNCATE TABLE по сути является оператором DELETE, он не может активировать триггер, поскольку операция не регистрирует удаления отдельных строк.Однако только те, у кого есть разрешения на выполнение TRUNCATE TABLE в таблице, должны беспокоиться о непреднамеренном обходе триггера DELETE с помощью оператора TRUNCATE TABLE.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top