Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Устанавливает момент проверки ограничений в текущей транзакции.
Примечание!
Синтаксис ссылочной целостности (ограничения внешних ключей) принимается, но не применяется.
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 всегда проверяются немедленно при вставке или изменении строки (а не в конце оператора). Ограничения уникальности и исключения, которые не объявлены как откладываемые, также проверяются немедленно.
Момент срабатывания триггеров, объявленных как «триггеры ограничений», также контролируется этой командой — они срабатывают одновременно с проверкой соответствующего ограничения.
Поскольку в Database имена ограничений не обязаны быть уникальными в пределах схемы (а только в пределах таблицы), возможно наличие более чем одного совпадения для указанного имени ограничения. В таком случае команда SET CONSTRAINTS воздействует на все найденные совпадения. Для неквалифицированного имени, как только одно или несколько совпадений будут найдены в какой-либо схеме из пути поиска, последующие схемы в пути не просматриваются.
Эта команда изменяет поведение ограничений только в текущей транзакции. Выполнение её вне блока транзакции вызывает предупреждение и в остальном не оказывает эффекта.
Данная команда соответствует поведению, определённому в стандарте SQL, за исключением того, что в Database она не применяется к ограничениям NOT NULL и CHECK. Кроме того, в Database недопускающие отложения ограничения уникальности проверяются немедленно, а не в конце оператора, как это рекомендует стандарт.