Каскадні обмеження посилальної цілісності

За допомогою каскадних обмежень посилальної цілісності можна визначати дії, які SQL Server робитиме, коли користувач спробує видалити або оновити ключ, на який вказують ще існуючі зовнішні ключі.

Пропозиції REFERENCES інструкцій CREATE TABLE і ALTER TABLE підтримують пропозиції ON DELETE і ON UPDATE. Каскадні дії можуть також бути визначені за допомогою діалогового вікна Зв'язки зовнішнього ключа.

За замовчуванням мається на увазі дію NO ACTION, якщо пропозиції ON DELETE і ON UPDATE не вказані.

ON DELETE NO ACTION

Вказує, що при спробі видалити рядок з ключем, на яку посилаються зовнішні ключі в рядках інших таблиць, потрібно повідомити про помилку, а для інструкції DELETE виконати відкат.

ON UPDATE NO ACTION

Вказує, що при спробі оновити ключове значення, на яке посилаються зовнішні ключі в рядках інших таблиць, потрібно повідомити про помилку, а для інструкції UPDATE виконати відкат.

Дії CASCADE, SET NULL і SET DEFAULT дозволяють видаляти і оновлювати значення ключів, що впливають на таблиці, в яких визначені зв'язку зовнішніх ключів, що призводять до таблиці, в яку вносяться зміни. Якщо каскадні посилальні дії були також визначені для цільових таблиць, то і там зазначені каскадні дії будуть застосовані при оновленні або видаленні відповідних рядків. Значення CASCADE не може бути зазначено для зовнішніх і первинних ключів в шпальтах типу timestamp.

ON DELETE CASCADE

Вказує, що при спробі видалити рядок з ключем, на яку посилаються зовнішні ключі в рядках інших таблиць, всі рядки, що містять ці зовнішні ключі, також повинні бути видалені.

ON UPDATE CASCADE

Вказує, що при спробі оновити ключове значення, на яке посилаються зовнішні ключі в рядках інших таблиць, все значення, що становлять цей зовнішній ключ, також повинні бути оновлені до нового значення ключа.

Значення CASCADE не може бути зазначено, якщо стовпець типу timestamp є частиною зовнішнього або посилального ключа.

ON DELETE SET NULL

Вказує, що при спробі видалити рядок з ключем, на яку посилаються зовнішні ключі в рядках інших таблиць, все значення, складові ці зовнішні ключі, повинні бути змінені на NULL. Щоб виконувалася ця обмеження, всі стовпці зовнішніх ключів цільової таблиці повинні допускати значення NULL.

ON UPDATE SET NULL

Вказує, що при спробі оновити ключове значення, на яке посилаються зовнішні ключі в рядках інших таблиць, все значення, складові ці зовнішні ключі, повинні бути змінені на NULL. Щоб виконувалася ця обмеження, всі стовпці зовнішніх ключів цільової таблиці повинні допускати значення NULL.

ON DELETE SET DEFAULT

Вказує, що при спробі видалити рядок з ключем, на яку посилаються зовнішні ключі в рядках інших таблиць, все значення, складові ці зовнішні ключі, повинні бути змінені на значення за замовчуванням. Щоб виконувалася ця обмеження, для всіх стовпців зовнішніх ключів цільової таблиці повинно бути визначено значення за замовчуванням. Якщо стовпець допускає значення NULL і безліч значень за замовчуванням не задано явно, NULL стає неявним значенням за замовчуванням для даного стовпця. Всі задаються пропозицією ON DELETE SET DEFAULT значення, відмінні від NULL, повинні мати відповідні значення в основній таблиці, щоб зберегти цілісність обмеження зовнішнього ключа.

ON UPDATE SET DEFAULT

Вказує, що при спробі оновити ключове значення, на яке посилаються зовнішні ключі в рядках інших таблиць, все значення, складові ці зовнішні ключі, повинні бути змінені на значення за замовчуванням. Щоб виконувалася ця обмеження, для всіх стовпців зовнішніх ключів цільової таблиці повинно бути визначено значення за замовчуванням. Якщо стовпець допускає значення NULL і безліч значень за замовчуванням не задано явно, NULL стає неявним значенням за замовчуванням для даного стовпця. Всі задаються пропозицією ON UPDATE SET DEFAULT значення, відмінні від NULL, повинні мати відповідні значення в основній таблиці, щоб зберегти цілісність обмеження зовнішнього ключа.

Дія ON DELETE CASCADE не може бути зазначено в таблиці, для якої визначено тригер INSTEAD OF DELETE. У таблицях, для яких визначені тригери INSTEAD OF UPDATE, не можуть бути вказані такі дії: ON DELETE SET NULL, ON DELETE SET DEFAULT, ON UPDATE CASCADE, ON UPDATE SET NULL і ON UDATE SET DEFAULT.

Окремі інструкції DELETE або UPDATE можуть почати серію каскадних довідкових дій. Наприклад, база даних містить три таблиці: TableA. TableB і TableC. Зовнішній ключ таблиці TableB визначено з дією ON DELETE CASCADE і пов'язаний з первинним ключем таблиці TableA. Зовнішній ключ таблиці TableC визначено з дією ON DELETE CASCADE і пов'язаний з первинним ключем таблиці TableB. Якщо інструкція DELETE видаляє рядки в таблиці TableA. ця ж операція призведе до видалення всіх рядків в таблиці TableB. в яких зовнішні ключі збігаються з віддаленими первинними ключами таблиці TableA. а потім - до видалення всіх рядків в таблиці TableC. в яких зовнішні ключі збігаються з віддаленими первинними ключами таблиці TableB.

Послідовності каскадних довідкових дій, що запускаються окремими інструкціями DELETE або UPDATE, повинні утворювати дерево без циклічних посилань. Ніяка таблиця не повинна з'являтися більше одного разу в списку всіх каскадних довідкових дій, викликаних інструкціями DELETE або UPDATE. Крім того, в дереві каскадних довідкових дій до будь-якої із задіяних таблиць повинен бути тільки один шлях. Кожна галузь в дереві переривається, як тільки зустрічається таблиця, для якої зазначено дію NO ACTION або взагалі не вказано дію.

Каскадні посилальні дії запускають тригери AFTER UPDATE або AFTER DELETE наступним чином:

Все каскадні посилальні дії, прямо викликані вихідними інструкціями DELETE або UPDATE, виконуються першими.

Якщо є які-небудь тригери AFTER, певні для змінених таблиць, ці тригери запускаються після виконання всіх каскадних дій. Ці тригери запускаються в порядку, зворотному каскадним дій. Якщо для однієї таблиці визначені кілька тригерів, вони запускаються в випадковому порядку, якщо тільки не вказані виділені перший і останній тригери таблиці. Цей порядок визначається процедурою sp_settriggerorder.

Якщо послідовності каскадних дій відбуваються з таблиці, яка була безпосередньою метою дій DELETE або UPDATE, порядок запуску тригерів цими послідовностями дій не визначений. Однак одна послідовність дій завжди запускає всі свої тригери до того, як це почне робити наступна.

Тригер AFTER таблиці, що була безпосередньою метою дій DELETE або UPDATE, запускається незалежно від того, чи були змінені хоч якісь рядки. У цьому випадку ні на які інші таблиці каскадирование не впливає.

Якщо один з попередніх тригерів виконує операції DELETE або UPDATE над іншими таблицями, ці операції можуть викликати власні послідовності каскадних дій. Ці вторинні послідовності дій обробляються для кожної операції DELETE або UPDATE після виконання всіх тригерів первинних послідовностей дій. Цей процес може рекурсивно повторюватися для подальших операцій DELETE або UPDATE.

Виконання операцій CREATE, ALTER, DELETE або інших операцій мови DDL всередині тригерів може привести до запуску тригерів DDL. Це може привести до подальших операцій DELETE або UPDATE, які почнуть додаткові послідовності каскадних дій і запустять свої тригери.

Якщо в будь-якій конкретній послідовності каскадних довідкових дій станеться помилка, в цій послідовності НЕ будуть запущені ніякі тригери AFTER, а для операцій DELETE або UPDATE, створюваних цією послідовністю, буде виконаний відкат.

У таблиці, для якої визначено тригер INSTEAD OF, може також бути пропозиція REFERENCES, яке вказує конкретне каскадне дію. Однак тригер AFTER цільової таблиці каскадного дії може виконати інструкцію INSERT, UPDATE або DELETE для іншої таблиці або подання, яке запустить тригер INSTEAD OF для цього об'єкта.