SET CONSTRAINTS
SET CONSTRAINTS — установить время проверки ограничений для текущей транзакции
Синтаксис
SET CONSTRAINTS { ALL | имя [, ...] } { DEFERRED | IMMEDIATE }
Описание
Команда SET CONSTRAINTS
задает поведение при проверке ограничений в рамках
текущей транзакции. Ограничения IMMEDIATE проверяются в конце каждого
оператора. Ограничения DEFERRED откладываются до фиксации
транзакции. Каждое из ограничений IMMEDIATE или DEFERRED задается
независимо.
При создании ограничения задается одна из трех характеристик:
DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE или
NOT DEFERRABLE. Третий вариант всегда подразумевает IMMEDIATE и не
зависит от команды SET CONSTRAINTS
. Первые два вариант запускаются
в каждой транзакции в указанном режиме, но их поведение может быть
изменено в рамках транзакции командой SET CONSTRAINTS
.
SET CONSTRAINTS
со списком имен ограничений изменяет режим только
этих ограничений (которые все должны быть откладываемыми). Каждое имя
ограничения может быть дополнено схемой. Если имя схемы не
указано, для поиска первого совпадающего имени используется текущий путь поиска
схемы. SET CONSTRAINTS ALL
изменяет режим всех откладываемых
ограничений.
Когда SET CONSTRAINTS
меняет режим ограничения с DEFERRED на
IMMEDIATE, новый режим начинает действовать в обратную сторону:
все изменения данных, которые были бы проверены в конце транзакции, вместо
этого проверяются во время выполнения команды SET CONSTRAINTS
. Если
какое-либо такое ограничение нарушается, при выполнении SET CONSTRAINTS
происходит ошибка (и не изменяется режим ограничения). Таким образом,
SET CONSTRAINTS
можно использовать для принудительной проверки
ограничений в определенной точке транзакции.
В настоящее время такое поведение распространяется только на ограничения UNIQUE, PRIMARY KEY, REFERENCES (внешний ключ) и EXCLUDE. Ограничения NOT NULL и CHECK всегда проверяются немедленно, в момент, когда строка добавляется или изменяется (не в конце оператора). Ограничения уникальности и исключения, которые не были объявлены как EFERRABLE, также проверяются немедленно.
Запуск триггеров, объявленных как «триггеры ограничений», также контролируется этой командой — они срабатывают в то время, когда должна произойти проверка связанного ограничения.
Примечания
Поскольку QHB не требует, чтобы имена ограничений были
уникальными в схеме (только в своей таблице), возможно
существование нескольких соответствующих ограничений для указанного имени
ограничения. В этом случае SET CONSTRAINTS
будет действовать на все
эти ограничения. Для имен без указания схемы действие команды будет
распространяться только на ограничение, найденное в первой из схем в пути
поиска, остальные схемы просматриваться не будут.
Эта команда изменяет только поведение ограничений в рамках текущей транзакции. При выполнении вне блока транзакций будет выдано предупреждение и больше ничего не произойдет.
Совместимость
Эта команда соответствует поведению, определенному в стандарте SQL, за исключением того, что QHB не влияет на проверку ограничения NOT NULL и CHECK. Кроме того, QHB проверяет неоткладываемые ограничения уникальности сразу же, а не в конце оператора, как предполагает стандарт.