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