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, также проверяются немедленно.
Срабатывание триггеров, объявленных как "триггеры ограничений", также зависит от этой команды — они срабатывают одновременно с проверкой соответствующего ограничения.
Примечания
Поскольку Greengage DB не требует уникальности имен ограничений в рамках схемы (достаточно уникальности в таблице), возможно, что для указанного имени существует более одного ограничения. В этом случае команда SET CONSTRAINTS будет применена ко всем ограничениям. Для имени без указания схемы после того, как будет найдено одно или несколько ограничений в какой-либо схеме в пути поиска, поиск в расположенных дальше по пути схемах не выполняется.
Эта команда изменяет поведение ограничений только в рамках текущей транзакции. При выполнении команды вне блока транзакции выдается предупреждение и больше ничего не происходит.
Совместимость
Эта команда реализует поведение, описанное в стандарте SQL, с одним исключением — в Greengage DB она не влияет на проверку ограничений NOT NULL и CHECK. Кроме того, Greengage DB проверяет неоткладываемые ограничения уникальности немедленно, а не в конце оператора, как это предполагает стандарт.