Delphi 3 и создание приложений баз данных

       

Обеспечение каскадных воздействий


Если между двумя или более ТБД установлены отношения ссылочной целостности (отношения "один-ко-многим", "один-к-одному"), при изменении столбца связи в родительской таблице должно быть изменено значение столбца связи у записей соответствующих дочерних таблиц. Такое воздействие на дочернюю таблицу носит название каскадного обновления. Если в родительской таблице удалена запись, должны быть удалены все связанные с ней записи в дочерней таблице. Такое воздействие на дочернюю таблицу носит название каскадного удаления.

Ограничение ссылочной целостности таблиц по внешнему ключу приводит к блокировке изменения и удаления записи в родительской таблице, если для нее есть дочерние записи в дочерней таблице:

CREATE TABLE TOVARY

(TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL, PRIMARY KEY(TOVAR));

CREATE TABLE RASHOD

(N_RASH INTEGER NOT NULL,

TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

PRIMARY KEY(N_RASH),

FOREIGN KEY(TOVAR) REFERENCES TOVARY

);

Для реализации автоматического выполнения каскадных обновлений и изменений необходимо, во-первых, удалить ссылочные целостности, блокирующие такие изменения в определении БД и, во-вторых, определить сами триггеры для родительской таблицы.

Триггер, реализующий каскадное обновление в дочерней таблице, будет в числе прочих содержать оператор

IF (OLD.ПoлeCвязиPoдитeля <> NEW.ПoлeCвязиPoдитeля) THEN



UPDATE ДочерняяТаблица

SET ПолеСвязиДочернейТаблицы = NEW.ПолеСвязиРодителя

WHERE ПолеСвязиДочернейТаблицы = OLD.ПолеСвязиРодителя ;

Триггер, реализующий каскадное удаление в дочерней таблице, будет в числе прочих содержать оператор

DELETE FROM ДочерняяТаблица

WHERE ПолеСвязиДочернейТаблицы =ПолеСвязиРодителя ;

Пример.

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

CREATE TRIGGER BUJTOVARY FOR TOVARY

ACTIVE

BEFORE UPDATE

AS

BEGIN

IF (OLD.TOVAR 0 NEW.TOVAR) THEN UPDATE RASHOD

SET TOVAR = NEW.TOVAR

WHERE TOVAR = OLD.TOVAR;

END

CREATE TRIGGER AD_TOVARY FOR TOVARY

ACTIVE

AFTER DELETE

AS

BEGIN

DELETE FROM RASHOD

WHERE RASHOD.TOVAR = TOVARY.TOVAR;

END



Содержание раздела