Немедленная и откладываемая проверка ограничений
На первый взгляд кажется, что ограничения целостности (всех видов) должны немедленно проверяться в случае выполнения любого действия, изменяющего содержимое базы данных (вставка в любую таблицу новой строки, изменение или удаление существующих строк). Однако можно определить такие ограничения целостности, логическое выражение которых будет принимать значение false при любой немедленной проверке. Одним из примеров такого ограничения является ограничение
CHECK (DEPT_EMP_NO =
(SELECT COUNT(*) FROM EMP
WHERE DEPT_NO = EMP.DEPT_NO))
из определения таблицы DEPT. Предположим, например, что в отдел зачисляется новый служащий. Тогда нужно выполнить две операции: (a) вставить новую строку в таблицу EMP и (b) изменить соответствующую строку таблицы DEPT (прибавить единицу к значению столбца DEPT_EMP_NO). Очевидно, что в каком бы порядке ни выполнялись эти операции, сразу после выполнения первой из них ограничение целостности будет нарушено, соответствующее действие будет отвергнуто, и мы никогда не сможем принять на работу нового служащего.
Поскольку ограничения целостности, немедленная проверка которых бессмысленна, являются нужными и полезными, в язык SQL включены средства, позволяющие регулировать время проверки ограничений. Если говорить более точно, в контексте каждой выполняемой транзакции каждое ограничение целостности должно находиться в одном из двух режимов: режиме немедленной проверки (immediate) или режиме отложенной проверки (deferred). Все ограничения целостности, находящиеся в режиме немедленной проверки, проверяются при выполнении в транзакции любой операции, изменяющей состояние базы данных. Если действие операции нарушает какое-либо немедленно проверяемое ограничение целостности, то это действие отвергается.1) Ограничения целостности, находящиеся в режиме отложенной проверки, проверяются при завершении транзакции (выполнении операции COMMIT)2). Если действия этой транзакции нарушают какое-либо отложенно проверяемое ограничение целостности, то транзакция откатывается (операция COMMIT трактуется как операция ROLLBACK).3)
Для этого в качестве заключительной синтаксической конструкции к любому определению ограничения целостности (любого вида) может быть добавлена спецификация INITIALLY в следующей синтаксической форме:
INITIALLY { DEFERRED | IMMEDIATE }
[ [ NOT ] DEFERRABLE ]
Эта спецификация указывает, в каком режиме должно находиться данное ограничение целостности в начале выполнения любой транзакции (INITIALLY IMMEDIATE означает, что в начале выполнения транзакции данное ограничение будет находиться в режиме немедленной проверки, а INITIALLY DEFERRED – что в начале любой транзакции ограничение будет находиться в режиме отложенной проверки), а также возможности смены режима этого ограничения при выполнении транзакции (DEFERRABLE означает, что для данного ограничения может быть установлен режим отложенной проверки, а NOT DEFERRABLE – что не может4)).
Комбинация INITIALLY DEFERRED NOT DEFERRABLE является недопустимой. Если в определении ограничения спецификация начального режима проверки отсутствует, то подразумевается наличие спецификации INITIALLY IMMEDIATE. При наличии явной или неявной спецификации INITIALLY IMMEDIATE и отсутствии явного указания возможности смены режима подразумевается наличие спецификации NOT DEFERRABLE. При наличии спецификации INITIALLY DEFERRED и отсутствии явного указания возможности смены режима подразумевается наличие спецификации DEFERRABLE.
При выполнении транзакции можно изменить режим проверки некоторых или всех ограничений целостности для данной транзакции. Для этого используется оператор SET CONSTRAINTS, задаваемый в следующем синтаксисе:
SET CONSTRAINTS { constraint_name_commalist | ALL }
{ DEFERRED | IMMEDIATE }
Если в операторе указывается список имен ограничений целостности, то все они должны быть DEFERRABLE; если хотя бы для одного ограничения из списка это требование не выполняется, то операция SET CONSTRAINTS отвергается. При указании ключевого слова ALL режим устанавливается для всех ограничений, в определении которых явно или неявно было указано DEFERRABLE. Если в качестве желаемого режима проверки ограничений задано DEFERRED, то все указанные ограничения переводятся в режим отложенной проверки. Если в качестве желаемого режима проверки ограничений задано IMMEDIATE, то все указанные ограничения переводятся в режим немедленной проверки. При этом если хотя бы одно из этих ограничений не удовлетворяется, то операция SET CONSTRAINTS отвергается, и все указанные ограничения остаются в предыдущем режиме.
При выполнении операции COMMIT неявно выполняется операция SET CONSTRAINTS ALL IMMEDIATE. Если эта операция отвергается, то COMMIT срабатывает как ROLLBACK.
- Введение в модель данных sql
- 1. Лекция: Язык баз данных sql: общее введение, типы данных и средства определения доменов Введение
- Краткая история языка sql
- Структура языка sql
- Типы данных sql
- Tочные числовые типы
- Истинно целые типы
- Точные типы, допускающие наличие дробной части
- Приближенные числовые типы
- Типы символьных строк
- Типы битовых строк
- Типы даты и времени
- Тип даты
- Типы времени
- Типы временной метки
- Типы времени и временной метки с временной зоной
- Типы временных интервалов
- Булевский тип
- Типы коллекций
- Типы массивов
- Типы мультимножеств
- Анонимные строчные типы
- Типы, определяемые пользователем
- Ссылочные типы
- Средства определения, изменения определения и отмены определения доменов
- Определение домена
- Примеры определений доменов
- Изменение определения домена
- Примеры изменения определения домена
- Отмена определения домена
- Неявные и явные преобразования типа или домена
- Неявные преобразования типов в sql
- Явные преобразования типов или доменов и оператор cast
- Заключение
- 2. Лекция: Язык баз данных sql: средства определения базовых таблиц и ограничений целостности
- Введение
- Средства определения, изменения и ликвидации базовых таблиц
- Определение базовой таблицы
- Определение столбца
- Значения столбца по умолчанию
- Ограничения целостности столбца
- Определение табличного ограничения
- Табличное ограничение первичного или возможного ключа
- Проверочное табличное ограничение
- Табличное ограничение внешнего ключа
- Разновидности способов сопоставления значений внешнего и возможного ключей
- Поддержка ссылочной целостности и ссылочные действия
- Примеры определений базовых таблиц
- Изменение определения базовой таблицы
- Добавление, изменение или удаление определения столбца
- Примеры изменения определения столбца
- Изменение набора табличных ограничений
- Примеры изменения набора табличных ограничений
- Отмена определения (уничтожение) базовой таблицы
- Средства определения и отмены общих ограничений целостности
- Определение общих ограничений целостности
- Отмена определения общего ограничения целостности
- Немедленная и откладываемая проверка ограничений
- Заключение
- 3. Лекция: Язык баз данных sql: общая характеристика оператора select и организация списка ссылок на таблицы в разделе from
- 4. Лекция: Язык баз данных sql: предикаты раздела where оператора select
- Предикат сравнения
- Примеры запросов с использованием предиката сравнения
- Предикат between
- Примеры запросов с использованием предиката between
- Предикат null
- Примеры запросов с использованием предиката null
- Предикат in
- Примеры запросов с использованием предиката in
- Предикат like
- Примеры запросов с использованием предиката like
- Предикат similar
- Примеры запросов с использованием предиката similar
- Предикат exists
- Примеры запросов с использованием предиката exists
- Предикат unique
- Примеры запросов с использованием предиката unique
- Предикат overlaps
- Примеры запросов с использованием предиката overlaps
- Предикат сравнения с квантором
- Примеры запросов с использованием предиката сравнения с квантором
- Предикат match
- Примеры запросов с использованием предиката match
- Предикат distinct
- Примеры запросов с использованием предиката distinct
- Заключение
- 5. Лекция: Язык баз данных sql: группировка и условия раздела having, порождаемые и соединенные таблицы
- Логические выражения раздела having
- Предикаты сравнения
- Предикат between
- Предикат null
- Предикат in
- Предикат like
- Предикат exists
- Предикат unique
- Предикаты сравнения с квантором
- Предикат distinct
- Более сложные конструкции оператора выборки
- Соединенные таблицы
- Формальные определения
- Примеры соединений разного вида
- Примеры запросов с использованием соединенных таблиц
- 6. Лекция: Язык баз данных sql: средства формулировки аналитических и рекурсивных запросов
- Возможности формулирования аналитических запросов
- Раздел group by rollup
- Агрегатная функция grouping
- Раздел group by cube
- Рекурсивные запросы
- Определения, относящиеся к рекурсии
- Рекурсивные запросы с разделом with
- Раздел search
- Раздел cyrcle
- Рекурсивные представления
- Заключение
- 7. Лекция: Язык баз данных sql: средства манипулирования данными
- Введение
- Базовые средства манипулирования данными
- Оператор insert для вставки строк в существующие таблицы
- Вставка всех строк указанной таблицы
- Вставка явно заданного набора строк
- Вставка строк результата запроса
- Оператор update для модификации существующих строк в существующих таблицах
- Оператор delete для удаления строк в существующих таблицах
- Представления, над которыми возможны операции обновления
- Представления, допускающие применение операций обновления, в стандарте sql/92
- Представления, допускающие применение операций обновления, в стандарте sql:1999
- Критерии применимости операций обновления
- Правила функциональных зависимостей
- Раздел with check option определения представления
- Режимы проверки cascaded и local
- Примеры результатов действия раздела with check option
- Исторический очерк