РЕШЕНИЕ:
Создание триггера:
При этом автоматически создастся файл trig273.sql, и откроется блокнот для его редактирования. В этот текстовый редактор заносим текст программы:
CREATEORREPLACETRIGGERtrig273
AFTER INSERT OR UPDATE
ON Dogovor
REFERENCING OLD AS old_row NEW AS new_row
FOR EACH ROW
DECLARE
CountFilms NUMBER;
BEGIN
IF (INSERTING) THEN
SELECT kol
FROM film
WHERE filmid=:new_row.filmid;
IF(CountFilms = 0) THEN
raise_application_error(-20001,'Все кассеты с данным фильмом находятся у клиентов!!!Придётся потерпеть!!!');
END IF;
UPDATE film
SET kol=kol-1
WHERE filmid=:new_row.filmid;
ELSIF (UPDATING) THEN
IF (:new_row.vozvrat IS NOT NULL) THEN
IF (:old_row.vozvrat IS NULL) THEN
UPDATE film
SET kol=kol+1
WHERE filmid=:new_row.filmid;
END IF;
END IF;
END IF;
END;
/
Запуск триггера на выполнение:
SQL> @trig273
Ввод усечен до 1 символов
Триггер создан.
Проверка в словаре данных:
SELECT TRIGGER_NAME, TRIGGER_TYPE, TABLE_NAME, TRIGGERING_EVENT
FROM USER_TRIGGERS
WHERE TRIGGER_NAME = ' trig273'
Проверка работы триггера:
Select * from film;
Insert into dogovor (kod_f, kod_kl, data_vidachi)
values(1,2, ’12.10.09');
select * from film;
Задача №14
ДАНО: |
Таблицы реляционной базы данных ORACLE |
||||
Таблица |
Реквизиты |
||||
Фильм |
Код фильма, название фильма, режиссер, стоимость, количество экземпляров |
||||
Клиент |
Код клиента, адрес, телефон |
||||
Договор |
Код договора, код фильма, код клиента, дата выдачи, дата возврата |
||||
ТРЕБУЕТСЯ: |
1. Создать триггер, который проверяет возможность вставки в таблицу Договор новой записи с существующими кодами клиентов и кодами фильмов в таблицах Фильм и Клиент. 2. В словаре данных проверить наличие и состояние триггера. 3. Проверить работу триггера. |
||||
РЕШЕНИЕ:
Создание триггера:
При этом автоматически создастся файл trig271.sql, и откроется блокнот для его редактирования. В этот текстовый редактор заносим текст программы:
CREATEORREPLACETRIGGERtrig2711
BEFORE INSERT
ON Dogovor
REFERENCING NEW as new_row
FOR EACH ROW
DECLARE
CountFilm NUMBER;
CountClient NUMBER;
BEGIN
SELECT count(filmid)
INTO CountFilm
FROM Film
WHERE Filmid=:new_row.filmid;
SELECT count(Clientid)
INTO CountClient
FROM Client
WHERE Clientid=:new_row.Clientid;
IF (CountFilm = 0) THEN
raise_application_error(-20001,'Данногофильманесуществует!!!');
ELSIF(CountClient = 0) then
raise_application_error(-20001,'Данного клиента не существует!!!');
ENDIF;
END;
/
После сохранения созданного, исполняем этот скрипт из командной строки
Запуск триггера на выполнение:
SQL> @trig2711
Ввод усечен до 1 символов
Триггер создан.
Выполняем проверку работы триггера:
SQL> insertintodogovor
2 values(10,'18.12.2004','',7);
insert into dogovor
*
ошибка в строке 1:
ORA-20001: Данного клиента не существует!!!
ORA-06512: на "EI0101.TRIG2711", line 19
ORA-04088: ошибка во время выполнения триггера 'EI0101.TRIG2711'
SQL> insert into dogovor
2 values(12,'18.12.2004','',5);
insert into dogovor
*
ошибкавстроке 1:
ORA-20001: Данного фильма не существует!!!
ORA-06512: на "EI0101.TRIG2711", line 17
ORA-04088: ошибка во время выполнения триггера 'EI0101.TRIG2711'
SQL> insert into dogovor
2 values(10,'18.12.2004','',5);
1 строка создана.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.