Указывает ли стандарт SQL порядок проверки ограничений и срабатывания триггеров? - PullRequest
8 голосов
/ 22 ноября 2011

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

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

1 Ответ

2 голосов
/ 24 ноября 2011

Это специфическое поведение, похоже, ошибка в MySQL , и оно влияет только на BEFORE INSERT триггеры, в то время как BEFORE UPDATE триггеры работают правильно.

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

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

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

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

...