Как возвращаемый триггер из функции влияет на операторы BEFORE или AFTER? - PullRequest
0 голосов
/ 25 июня 2019

У меня небольшие проблемы с пониманием функций и триггеров в SQL. Я не опубликовал код процедуры chkInsertAritcle, но допустим, что он возвращает NEW, если ему удалось внести изменения, и NULL, если этого не произошло.

Итак, мой вопрос о триггере. Если я добавлю AFTER INSERT, значит ли это, что он завершит INSERT, не завися от возвращаемого значения? И что происходит с остальными строками?

Следующий вопрос: если я добавлю ПЕРЕД ВСТАВКОЙ, в каком порядке выполняется код?

Спасибо!

CREATE TRIGGER ArticleIns
AFTER INSERT ON ListOfArticles
FOR EACH ROW
EXECUTE PROCEDURE chkInsertArticle();

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Сначала все триггеры BEFORE запускаются в алфавитном порядке, затем выполняется операция, затем все триггеры AFTER запускаются в алфавитном порядке.

Каждая операция видит результат предыдущего в качестве ввода, иесли какой-либо триггер возвращает NULL, обработка для этой строки прекращается.Таким образом, если триггер BEFORE возвращает NULL, операция DML не будет выполняться.

Это происходит независимо для каждой строки, на которую воздействует оператор DML запуска.

1 голос
/ 25 июня 2019

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

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

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

...