Базы данных SQL-DDL и SQL-DML. Изучение транзакций. Программирование на языке SQL. Консольное приложение (Цикл лабораторных работ). Вариант № 2, страница 10

Уровень изоляции Snapshot table stability не рекомендуется для общих целей. Он должен использоваться только тогда, когда это действительно необходимо, в течение коротких периодов времени. А затем он должен быть подтверждён или откатан, потому что любая другая транзакция, которая пытается писать в ту же таблицу, получит сообщение об ошибке или будет введена в состояние ожидания.

Раздел 4.  Программирование на языке SQL

4.1. Цели работы

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

4.2. Программа работы

1) Изучить возможности языка PSQL

2) Создать два триггера: один триггер для автоматического заполнения ключевого поля, второй триггер для контроля целостности данных в подчиненной таблице при удалении/изменении записей в главной таблице

3) Создать хранимую процедуру в соответствии с индивидуальным заданием, полученным у преподавателя

4.3. Выполнение работы

1) Создадим необходимые триггеры.

Триггер для автоматического заполнения ключевого поля:

SET SQL DIALECT 3;

CREATE GENERATOR GEN_FILM_ID;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NEW_FILM FOR FILM

ACTIVE BEFORE INSERT POSITION 0

AS

begin

  IF (NEW.f_id IS NULL) THEN

    NEW.f_id = GEN_ID(GEN_FILM_ID,1);

end

^

SET TERM ; ^

Триггер для контроля целостности данных в подчиненной таблице при удалении записей в главной таблице (таблице фильмов):

SET SQL DIALECT 3;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DELETE_FILM FOR FILM

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

    DELETE FROM soundtrack WHERE film = OLD.f_id;

    DELETE FROM rating WHERE FILM_ID = OLD.f_id;

    DELETE FROM PRODUCTION WHERE FILM_ID = OLD.f_id;

    DELETE FROM premium WHERE FILM_ID = OLD.f_id;

    DELETE FROM part WHERE FILM_ID = OLD.f_id;

    DELETE FROM made_in WHERE FILM_ID = OLD.f_id;

    DELETE FROM style WHERE FILM_ID = OLD.f_id;

END

^

SET TERM ; ^

Триггер для контроля целостности данных в подчиненной таблице при изменении записей в главной таблице (таблице фильмов):

SET SQL DIALECT 3;

SET TERM ^ ;

CREATE OR ALTER TRIGGER UPDATE_FILM FOR FILM

ACTIVE AFTER UPDATE POSITION 0

AS

begin

  IF (OLD.f_id <> NEW.f_id) THEN

      begin

       UPDATE soundtrack SET film = NEW.f_id WHERE film = OLD.F_ID;

       UPDATE style SET FILM_ID = NEW.f_id WHERE FILM_ID = OLD.F_ID;

       UPDATE rating SET FILM_ID = NEW.f_id WHERE FILM_ID = OLD.F_ID;

       UPDATE production SET FILM_ID = NEW.f_id WHERE FILM_ID = OLD.F_ID;

       UPDATE premium SET FILM_ID = NEW.f_id WHERE FILM_ID = OLD.F_ID;

       UPDATE part SET FILM_ID = NEW.f_id WHERE FILM_ID = OLD.F_ID;

       UPDATE made_in SET FILM_ID = NEW.f_id WHERE FILM_ID = OLD.F_ID;

   end

end

^

SET TERM ; ^

Примеры работы триггеров:

1)

INSERT INTO film (name,year_of_creation,duration,budget)

VALUES ('Manhattan',1979,96,39000000);

В результате работы триггера в таблицу фильмов добавится ещё один фильм с  уникальным ключевым полем.

2) DELETE FROM film WHERE name LIKE '%Lord%';

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

3) UPDATE film SET f_id=7 WHERE f_id = 9;

При выполнении модификации записей в главной таблице, в подчиненных таблицах изменяются записи, содержащие внешние ключи на изменяемый фильм:

1 record(s) was(were) updated in FILM

2 record(s) was(were) updated in PART

1 record(s) was(were) updated in PREMIUM