Когда проверяются ограничения таблиц в SQL-вставках? - PullRequest
0 голосов
/ 12 декабря 2018

Допустим, у меня есть триггер, который должен предотвращать вставку чего-либо в таблицу, если данное условие не выполняется.Это означает, что я, вероятно, должен использовать BEFORE INSERT.Это правильно?

Но если я использую BEFORE INSERT, ограничения целостности не будут проверяться, когда я запускаю функцию на триггере.Таким образом, они могут нарушать ограничения (например, не нулевые ограничения).Основная проблема заключается в том, что я могу попытаться выполнить операции с недопустимыми данными.

Существует ли способ принудительно проверить ограничения, а затем запустить триггер, фактически не вставляя объекты встол первый?

1 Ответ

0 голосов
/ 12 декабря 2018

Непонятно, что вы имеете в виду, пытаясь выполнить операции с недопустимыми данными.

Если вы получаете исключение в триггере BEFORE, поскольку выполняете там операцию (скажем,деление на ноль, которое было бы исключено ограничением), тогда триггер и все INSERT будут прерваны, так же, как если бы ограничение вызвало исключение позже.Поэтому не о чем беспокоиться.

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

Если оба сработают, перейдите к триггеру BEFORE.Если вы выбросите исключение до того, как строка будет вставлена, вы точно не создадите мертвый кортеж.

...