Skip to content

БД11. Декларативная и процедурная поддержка ограничений целостности. Поддержка ограничений целостности в стандарте языка SQL.

Winterpuma edited this page Jul 5, 2021 · 1 revision

Транзакции и целостность БД

Каждая система обладает своими средствами поддержки ограничений целостности. Различают два способа реализации:

  • Декларативная поддержка ограничений целостности.
  • Процедурная поддержка ограничений целостности.

Декларативная поддержка

Декларативная поддержка ограничений целостности заключается в определении ограничений средствами языка определения данных (DDL - Data Definition Language). Обычно средства декларативной поддержки целостности определяют ограничения на значения доменов и атрибутов, целостность сущностей (потенциальные ключи отношений) и ссылочную целостность (целостность внешних ключей). Декларативные ограничения целостности можно использовать при создании и модификации таблиц средствами языка DDL или в виде отдельных утверждений (ASSERTION).

Например, следующий оператор создает таблицу PERSON и определяет для нее некоторые ограничения целостности:

CREATE TABLE PERSON
  (Pers_Id INTEGER PRIMARY KEY,
  Pers_Name CHAR(30) NOT NULL,
  Dept_Id REFERENCES DEPART(Dept_Id) ON UPDATE CASCADE ON DELETE CASCADE);

После выполнения оператора для таблицы PERSON будут объявлены следующие ограничения целостности:

  • Поле Pers_Id образует потенциальный ключ отношения.
  • Поле Pers_Name не может содержать null-значений.
  • Поле Dept_Id является внешней ссылкой на родительскую таблицу DEPART, причем, при изменении или удалении строки в родительской таблице каскадно должны быть внесены соответствующие изменения в дочернюю таблицу.

Процедурная поддержка ограничений целостности

Процедурная поддержка ограничений целостности заключается в использовании триггеров и хранимых процедур.

Не все ограничения целостности можно реализовать декларативно. Примером такого ограничения может служить требование из примера 1, утверждающее, что поле Dept_Kol таблицы DEPART должно содержать количество сотрудников, реально числящихся в подразделении. Для реализации этого ограничения необходимо создать триггер, запускающийся при вставке, модификации и удалении записей в таблице PERSON, который корректно изменяет значение поля Dept_Kol.

Поддержка ограничений целостности в стандарте языка SQL.

Стандарт SQL позволяет задавать декларативные ограничения следующими способами:

  • Как ограничения домена.
  • Как ограничения, входящие в определение таблицы.
  • Как ограничения, хранящиеся в базе данных в виде независимых утверждений (assertion).

Стандарт SQL не предусматривает процедурных ограничений целостности, реализуемых при помощи триггеров и хранимых процедур, однако существуют действия, исполняемые по ссылке. Эти действия определяют, что будет происходить при изменении значения родительского ключа, на который ссылается некоторый внешний ключ. Эти действия можно задавать независимо для операций обновления (ON UPDATE) или для операций удаления (ON DELETE) записей в родительском отношении.

Стандартом SQL определяется 4 типа действий, исполняемых по ссылке:

  • CASCADE. Изменения значения родительского ключа автоматически приводят к таким же изменениям связанного с ним значения внешнего ключа. Удаление кортежа в родительском отношении приводит к удалению связанных с ним кортежей в дочернем отношении.
  • SET NULL. Все внешние ключи, которые ссылаются на обновленный или удаленный родительский ключ получают значения NULL.
  • SET DEFAULT. Все внешние ключи, которые ссылаются на обновленный или удаленный родительский ключ получают значения, принятые по умолчанию для этих ключей.
  • NO ACTION. Значения внешнего ключа не изменяются. Если операция приводит к нарушению ссылочной целостности (появляются "висящие" ссылки), то такая операция не выполняется.
Clone this wiki locally