Вопрос

У меня есть триггер на вставке, но если спусковой крючок не удается, вставка тоже не удается.

Есть ли способ позволить вставке продолжаться, даже если спусковой крючок не удается?

РЕДАКТИРОВАТЬ: Я использую триггер для отправки электронной почты при введении новой записи. Я хочу, чтобы запись была сохранена независимо от того, было ли отправлено электронное письмо или нет ..

Как бы я сделал это из SP?

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

Решение

Нет

  • Триггер является частью транзакции
  • Ошибка прервет операцию вставки (если не в явной транзакции)
  • Ошибка в триггере обречь транзакцию (то есть должна быть откатана)
  • Ошибка в триггере, где блоки попытки/поймать нет Используется (также вокруг вставки) будет прервать партию

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

Лично сбой спуска означает, что какая -то сложная DRI не удалась, или я не могу написать в таблице истории. Это плохо ...

Редактировать:

  • Используйте сервисный брокер, чтобы отправить уведомление с триггера.
  • Другой кусок кода поднимет его и отправит асинхронно

Я не реализовал себя, поэтому мне придется направить вас к Google

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

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

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

ДА

Триггер не работает по его нормальным инструкциям, нулевым значениям и т. Д.

:: Используйте вместо вставки триггер начните с

Выберите в #inserted из вставленных

Объявить @Query Nvarchar (max), @iretval int

:: Вы можете обойти неудачу, превратив каждую инструкцию в запрос

set @Query = n'update .... и т.д. '

:: Также хорошая идея проверить запрос перед sp_executesql, потому что :: Если запрос нук

Если @query is null begin set @uretval = 999 goto last end

::тогда

exec @iretval = sp_executesql @Query [[parMameters] outValue] Если @Iretval> 0 goto last

:: Ваша вставка должна нести флаг или что -то еще, чтобы показать, сработал ли триггер, позволяя последующей обработке, что триггер не предполагает, что это требуется

Последний

if @iretval = 0 Обновление #inserted set flag = ok

Вставьте в таблицу выберите * из #inserted

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

Если есть пример. Напишите мне jhodgson@tsti.co.za

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