SET CONSTRAINTS#

SET CONSTRAINTS

SET CONSTRAINTS

SET CONSTRAINTS — установить время проверки ограничения для текущей транзакции

Синтаксис

SET CONSTRAINTS { ALL | name [, ...] } { 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, также проверяются немедленно.

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

Примечания

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

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

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

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