Определяет ли стандарт SQL порядок проверки ограничений и срабатывания триггера?

Мне любопытно, могу ли я полагаться на какой-либо конкретный порядок проверки NOT NULL, FOREIGN KEY, UNIQUE, CHECK ограничений и BEFORE триггеров.

По опыту знаю, что MySQL сначала проверяет NOT NULL, затем запускает BEFORE триггер, а затем проверяет UNIQUE ограничения. Oracle проверяет NOT NULL после триггера BEFORE (думаю, SQLServer делает то же самое, но не помню). Говорит ли стандарт что-нибудь о заказе или это полностью зависит от поставщика БД?


person a1ex07    schedule 21.11.2011    source источник
comment
Oracle не проверяет NOT NULL до тех пор, пока не сработает before. Это позволяет триггеру before изменять значения так, чтобы они больше не были нулевыми.   -  person Shannon Severance    schedule 22.11.2011
comment
@Shannon Severance: Да, извини, я думал о mysql... Исправлено   -  person a1ex07    schedule 22.11.2011
comment
Вы можете загрузить черновик (ссылка взята из Википедии) самого последнего стандарта и просмотреть его. сами (не могу найти таких определений)   -  person Damien_The_Unbeliever    schedule 23.11.2011
comment
В SQL Server порядок Instead Of Trigger Entered ,Check NULL constraint, Unique constraints, check constraints, FK, After Trigger, Instead Of Trigger Exited от тестирования, которое я провел, чтобы ответить на этот вопрос   -  person Martin Smith    schedule 23.11.2011
comment
Это явно деталь реализации, поэтому я крайне сомневаюсь, что стандарт вообще что-то скажет по этому поводу.   -  person Martin Smith    schedule 23.11.2011
comment
@ Мартин Смит: Спасибо за ссылку и порядок SQLServer... Я думал, что это может быть какой-то «нормальный» порядок. На практике меня больше всего интересовало BEFORE TRIGGER (конечно, если RMDS поддерживает это) против ограничений.   -  person a1ex07    schedule 23.11.2011
comment
@Damien_The_Unbeliever: Спасибо за ссылку.   -  person a1ex07    schedule 23.11.2011


Ответы (1)


Такое поведение похоже на ошибку в MySQL и влияет только на BEFORE INSERT триггеров. , а триггеры BEFORE UPDATE ведут себя корректно.

В стандарте (как указано в комментариях к вопросу), конечно, это не указано явно, но это определенно подразумевается:

Для каждого изменения состояния SCi,j в TECi триггеры BEFORE, активированные SCi,j, выполняются до того, как вступят в силу какие-либо из их триггерных событий. Когда эти триггерные события вступили в силу, выполняются все триггеры AFTER, активированные изменениями состояния TECi.

Ошибка NOT NULL должна быть частью INSERT или UPDATE (т.е. инициирующего события). Стандарт не должен указывать это. Нет абсолютно нет смысла предварительно проверять ограничения на набор изменений, которые не являются окончательными, потому что ваш BEFORE триггер способен как устранять ошибки, и добавлять новые.

РЕЗЮМЕ. На самом деле это не зависит от поставщика БД, поскольку проверка ограничений после триггера «до» всегда необходима.

person Kevin Stricker    schedule 24.11.2011