Триггер не должен блокировать вставку
-
16-10-2019 - |
Вопрос
У меня есть триггер на вставке, но если спусковой крючок не удается, вставка тоже не удается.
Есть ли способ позволить вставке продолжаться, даже если спусковой крючок не удается?
РЕДАКТИРОВАТЬ: Я использую триггер для отправки электронной почты при введении новой записи. Я хочу, чтобы запись была сохранена независимо от того, было ли отправлено электронное письмо или нет ..
Как бы я сделал это из 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