Уровень изоляции 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.