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 всегда проверяются немедленно, в момент, когда строка добавляется или изменяется (не в конце оператора). Ограничения уникальности и исключения, которые не были объявлены как DEFERRABLE, тоже проверяются немедленно.

Запуск триггеров, объявленных как «триггеры ограничений», также контролируется этой установкой — они срабатывают в то время, когда должна произойти проверка связанного ограничения.


Примечания

Поскольку QHB не требует, чтобы имена ограничений были уникальными в схеме (только в своей таблице), возможно существование нескольких соответствующих ограничений для указанного имени ограничения. В этом случае SET CONSTRAINTS будет действовать на все эти ограничения. Для имен без указания схемы действие команды будет распространяться только на первое ограничение, найденное в некоторой схеме в пути поиска, остальные схемы просматриваться не будут.

Эта команда изменяет только поведение ограничений в рамках текущей транзакции. При выполнении вне блока транзакции будет выдано предупреждение и больше ничего не произойдет.


Совместимость

Эта команда соответствует поведению, определенному в стандарте SQL, за исключением того, что в QHB она не применяется к ограничениям NOT NULL и CHECK. Кроме того, QHB проверяет неоткладываемые ограничения уникальности сразу же, а не в конце оператора, как предполагает стандарт.