Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с Oracle / Триггеры в PL SQL.ppt
Скачиваний:
8
Добавлен:
28.06.2021
Размер:
905.73 Кб
Скачать

Создание последовательности CATALOGS_SEQ

Создание триггера NEW_CATALOG_TRIGGER (1)

1.На вкладке Connections разверните bookshop-XE. Появится список типов объектов схемы.

2.Щелкните ПКМ Triggers. Появится список выбора.

3.Нажмите New Trigger. Откроется окно Create trigger. Поле Schema имеет значение bookshop и поле Name имеет значение по умолчанию Trigger1.

4.В поле Name введите NEW_CATALOG_TRIGGER вме- сто значения по умолчанию.

5.На вкладке Trigger в поле Table Name из меню выбери- те CATALOGS, выберите пункт Row Lewel, установите флажок Insert, нажмите ОК.

Создание триггера NEW_CATALOG_TRIGGER (2)

Создание триггера NEW_CATALOG_TRIGGER (3)

6.Открывается панель, показывающая оператор CREATE TRIGGER

6.Название NEW_EVALUATION_TRIGGER панели дано курсивом (триггер еще не сохранен в БД).

Создание триггера NEW_CATALOG_TRIGGER (4)

8.В операторе CREATE TRIGGER замените NULL следующим:

:NEW.cat_ID : = CATALOGS_SEQ.NEXTVAL

nВ меню File выберите Save.

nOracle Database XE компилирует процедуру и сохраняет ее. Название NEW_CATALOG_TRIGGER на панели больше не выделяется курсивом.

Результаты работы триггера

Пример триггера - 3

В демонстрационной БД таблица Orders не хранит сумму заказа, которая является производной величиной

(o_number * b_price).

Можно создать в этой таблице столбец o_summa, разре- шив для него значения NULL.

На таблицу Orders устанавливается триггер, который перед вставкой или обновлением заказа автоматически вычисляет сумму заказа и заносит в соответствующий столбец.

Пример триггера - 3

CREATE OR REPLACE TRIGGER ord_summa BEFORE INSERT OR UPDATE

ON Orders

FOR EACH ROW DECLARE

price NUMBER(7, 2);

BEGIN

SELECT b_price INTO price FROM Books WHERE Books.book_ID = :NEW.o_book_ID ; :NEW.o_summa := : NEW . o_number * price ;

END ord_summa;

Пример триггера - 4

CREATE OR REPLACE TRIGGER proverka BEFORE UPDATE

ON Orders

FOR EACH R OW DECLARE

no_name_change EXCEPTION; BEGIN

IF (:NEW.o_book_ID <> :OLD.o_book_ID) THEN

RAISE no_name_change; END IF;

Пример триггера - 4

EXCEPTION

WHEN no_name_change THEN

dbms_output.put_line ('Изменение вида товаров в заказах запрещено');

dbms_output.put_line ('Прервано и возвращены старые значения');

:NEW.order_ID := :OLD.order_ID; :NEW.o_user_ID := :OLD.o_user_ID; :NEW.o_book_ID := :OLD.o_book_ID; :NEW.o_time := :OLD.o_time; :NEW.o_number := :OLD.o_number;

END proverka;