Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы к экзамену ИИС.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
445.95 Кб
Скачать

27. Триггеры бд.

1.Триггер проверяет возможность удаления записи из таблицы «Клиент». Если в таблице «Заказы» существуют связанные записи, то выдается сообщение об ошибке. В противном случае запись удаляется.

SQL> edit trigdelete;

\\Текст триггера:

CREATE OR REPLACE TRIGGER trigdelete

BEFORE DELETE

ON client

REFERENCING OLD as old_row

FOR EACH ROW

DECLARE

A number;

BEGIN

SELECT count(clientid) INTO A

FROM orders

WHERE clientid=:old_row.clientid;

if (A > 0) THEN

raise_application_error(-20001, 'Neobxodimo udalit svyazannie zapisi iz tablici zakazi!');

END IF;

END;

/

SQL> SET SERVEROUTPUT ON;

SQL> @trigdelete

Триггер создан.

SQL> delete from client

2 where clientid=3;

delete from client

*

ошибка в строке 1:

ORA-20001: Neobxodimo udalit svyazannie zapisi iz tablici zakazi!

ORA-06512: на "SCOTT.TRIGDELETE", line 10

ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGDELETE'

SQL> delete from client

2 where clientid=2;

1 строка удалена.

SQL> select * from client;

CLIENTID FIO CL_PHONE EMAIL

---------- -------------------- ----------- ---------------

1 Komarov AV 4563214 kav@mail.ru

3 Ivanova IM 3216589 iim@mail.ru

4 Smirnova SO 9854786 ssov@mail.ru

2. Триггер проверяет возможность вставки данных в таблицу «Заказы». Если параметры новой записи соответствуют кодам клиента, спектакля и театра в соответствующих таблицах «Клиент», «Спектакль» и «Театр», то запись успешно вставляется. Если какая-либо из записей не соответствует значению первичного ключа, выдается ошибка.

SQL> edit triginsert;

\\Текст триггера:

CREATE OR REPLACE TRIGGER triginsert

BEFORE INSERT

ON Orders

REFERENCING NEW as new_row

FOR EACH ROW

DECLARE

CountPlay NUMBER;

CountClient NUMBER;

CountTheatre NUMBER;

BEGIN

SELECT count(playid)

INTO CountPlay

FROM play

WHERE playid=:new_row.playid;

SELECT count(clientid)

INTO CountClient

FROM client

WHERE clientid=:new_row.clientid;

SELECT count(theatreid)

INTO CountTheatre

FROM theatre

WHERE theatreid=:new_row.theatreid;

IF (CountPlay = 0) THEN

raise_application_error(-20001,'Spektaklya s takim kodom ne sushestvuet!!!');

END IF;

IF(CountClient = 0) then

raise_application_error(-20001,'Klienta s takim kodom ne sushestvuet!!!');

END IF;

IF(CountTheatre = 0) then

raise_application_error(-20001,'Teatra s takim kodom ne sushestvuet!!!');

END IF;

END;

/

SQL> SET SERVEROUTPUT ON;

SQL> @triginsert

Триггер создан.

SQL> insert into orders

2 values (4, 2, 1, 3, '13-05-2009', '17-05-2009', '17-05-2009');

insert into orders

*

ошибка в строке 1:

ORA-20001: Klienta s takim kodom ne sushestvuet!!!

ORA-06512: на "SCOTT.TRIGINSERT", line 22

ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGINSERT'

SQL> insert into orders

2 values (4, 1, 10, 3, '13-05-2009', '17-05-2009', '17-05-2009');

insert into orders

*

ошибка в строке 1:

ORA-20001: Spektaklya s takim kodom ne sushestvuet!!!

ORA-06512: на "SCOTT.TRIGINSERT", line 19

ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGINSERT'

SQL> insert into orders

2 values (4, 1, 1, 5, '13-05-2009', '17-05-2009', '17-05-2009');

insert into orders

*

ошибка в строке 1:

ORA-20001: Teatra s takim kodom ne sushestvuet!!!

ORA-06512: на "SCOTT.TRIGINSERT", line 25

ORA-04088: ошибка во время выполнения триггера 'SCOTT.TRIGINSERT'

SQL> insert into orders

2 values (4, 3, 3, 1, '13-05-2009', '17-05-2009', '17-05-2009');

1 строка создана.