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 ограничения всегда проверяются немедленно при вставке или изменении строки (не в конце оператора).
Ограничения уникальности и исключения, которые не были объявлены как
откладываемые также проверяются немедленно.
Срабатывание триггеров, объявленных как «триггеры ограничений,» также управляется этим параметром — они срабатывают в то же время, в которое должно проверяться соответствующее ограничение.
Поскольку Digital Q.DataBase не требует уникальности имен ограничений в пределах схемы (они должны быть уникальны только в рамках таблицы), для одного имени ограничения может быть найдено несколько совпадений. В этом случае SET CONSTRAINTS будет действовать на все найденные совпадения. Для имени, не квалифицированного схемой, как только одно или несколько совпадений будут найдены в какой-либо схеме в пути поиска, поиск в схемах, расположенных далее в этом пути, не производится.
Данная команда изменяет поведение ограничений только в рамках текущей транзакции. Выполнение этой команды вне блока транзакции приводит к выводу предупреждения и не имеет иного эффекта.
Данная команда соответствует поведению, определенному в стандарте SQL, за исключением того ограничения, что в
Digital Q.DataBase, это не распространяется на
NOT NULL и CHECK ограничения.
Также, Digital Q.DataBase проверяет неоткладываемые ограничения уникальности немедленно, а не в конце инструкции, как предписывает стандарт.