You are on page 1of 11

ЛАБОРАТОРНА РОБОТА №6

СТВОРЕННЯ ТРИГЕРІВ

6.1 МЕТА РОБОТИ


Вивчення засобів автоматичного ведення баз даних.

6.2 ТЕОРЕТИЧНІ ВІДОМОСТІ:

Фактично тригер - це спеціальний вид ПЗ, котру СУБД викликає при


виконанні деяких операцій модифікації відповідних таблиць чи уявлень. Тригер
автоматично активізує при виконанні операції, з якою він пов’язаний. Тригери
зв’язуються з однією чи декількома операціями модифікації над однією
таблицею.
NEW.column Нова контекстна змінна, котра вказує на нове значення
стовпчиків в операціях INSERT і UPDATE.
OLD.column Стара контекстна змінна, котра вказує на значення
стовпчика перед операціями INSERT і UPDATE.
Синтаксис:
CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE}
[POSITION number]
AS <trigger_body> terminator
<trigger_body> =
[<variable_declaration_list>] <block>
<variable_declaration_list> =
DECLARE VARIABLE variable <datatype>;
[DECLARE VARIABLE variable <datatype>; ...]
<block> =
BEGIN
<compound_statement>
[<compound_statement> ...]
END

Де:
Тable – ім’я таблиці чи уявлення, для котрих спрацьовує тригер, коли визначена
операція відбувається над таблицею чи уявлення.
ACTIVE (по умовчанню) – означає, що тригер спрацьовує при наявності умов.
INACTIVE – означає, що тригер неактивний.
BEFORE - означає, що тригер спрацьовує перед асоційованої операції.
AFTER - означає, що тригер спрацьовує після асоційованої операції.
DELETE | INSERT | UPDATE - означає дію над таблицею, котра викликає
спрацювання тригера.
POSITION number - визначає порядок спрацювання для тригера перед тією ж
дією чи після тієї ж дії. number повинен бути цілим від 0...32767.
Тригер з меншим номером спрацьовує раніше. За замовчуванням: 0
= перший тригер спрацьовує. Номера тригерів не повинні бути
послідовні. Тригери для однієї і тієї ж дії з однаковим позиційним
номером будуть спрацьовувати у випадковому порядку.
DECLARE VARIABLE var <datatype> - оголошує локальні змінні, які
використовуються тільки в тригері. Кожному оголошенню повинно
передувати DECLARE VARIABLE, яке повинно завершуватися
точкою з крапкою (;).
Param – ім’я локальної змінної, унікально для змінної всередині тригера.
<datatype> - будь-який тип даних InterBase.
Statement – будь-яка одинична інструкція в мові процедур і тригерів InterBase.
Кожна інструкція (виключаючи BEGIN і END) повинні
завершуватися точкою з зап’ятою (;).
Terminator - термінатор визначенний SET TERM, який вказує на завершення
тіла тригера. Використовується тільки в ISQL.

2
Приклад:
Наступний тригер, SAVE_SALARY_CHANGE, робить коректуючі
модифікації таблиці SALARY_HISTORY, коли проходять зміни платні
співпрацівника в таблиці EMPLOYEE:

SET TERM !! ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
AFTER UPDATE AS
BEGIN
IF (OLD.SALARY <> NEW.SALARY) THEN
INSERT INTO SALARY_HISTORY
(EMP_NO, CHANGE_DATE, UPDATER_ID, OLD_SALARY,
PERCENT_CHANGE)
VALUES (OLD.EMP_NO, "now", USER, OLD.SALARY,
(NEW.SALARY - OLD.SALARY) * 100 / OLD.SALARY);
END !!
SET TERM ; !!

В реченні POSITION number вказується порядковий номер – яким за


рахунком повинен даний тригер спрацьовувати. Наприклад, якщо тригери A, В,
С, D визначені наступним чином:
CREATE TRIGGER A FOR STUDENT BEFORE UPDATE POSITION 5 AS ...
CREATE TRIGGER В FOR STUDENT BEFORE UPDATE POSITION 0 AS ...
CREATE TRIGGER С FOR STUDENT AFTER UPDATE POSITION 5 AS ...
CREATE TRIGGER D FOR STUDENT AFTER UPDATE POSITION 3 AS ...
то при операції зміни даних у таблиці STUDENT тригери будуть спрацьовувати
в послідовності В, А, D, С. Враховано, що А і В визначені як BEFORE.
У версії Oracle 8.1 ціла серія нових видів тригерів. Зокрема, шість з них
запускаються повідомленнями, які виникають при виконанні дій на рівні схеми, і

3
тому носять назву "тригери для подій рівня схеми БД". Перелік подій, що їх
запускають:
- SERVERERROR - тригер спрацьовує при виникненні серверної помилки;
- LOGON - тригер спрацьовує при успішному підключенні до системи
клієнтського додатку;
- LOGOFF - тригер спрацьовує перед відключенням клієнтського додатку;
- CREATE - тригер спрацьовує при додаванні до схеми нового об’єкту
командою CREATE;
- DROP - тригер спрацьовує перед спробою видалити зі схеми об’єкт командою
DROP;
- ALTER - тригер спрацьовує при зміні об’єкту схеми командою ALTER.

Загальний синтаксис опису тригерів схеми такий:


CREATE [ OR REPLACE ] TRIGGER ім’я.тригера
{ BEFORE|AFTER }
{ SERVERERROR | LOGON | LOGOFF | CREATE | DROP | ALTER }
ON iм’я.схеми.SCHEMA
BEGIN
текст на PL/SQL
END;

З кожною подією пов’язано декілька атрибутів. Фактично ці атрибути —


системні функції, які повертають деякий результат при звертанні до них з тіла
тригера. В СУБД Oracle раніше були визначені два типи тригерів: тригери, котрі
можуть бути запущені перед реалізацією операції модифікації, вони
називаються BEFORE-тригерами, і тригери, котрі активізуються після
виконання відповідних модифікацій - вони називаються AFTER-тригерами. Для
створення таких тригерів використовується команда, синтаксис якої подібний
синтаксису SQL InterBase:

CREATE TRIGGER <имя_триггера>


4
ON <имя_таблицы>
FOR {[INSERT][, UPDATE] [, DELETE] }
[WITH ENCRIPTING]
AS
SQL-операторы (Тело триггера)

Ім’я тригеру є ідентифікатором у вбудованій мові програмування СУБД і


повинно задовольняти відповідним вимогам. В параметрі FOR задається одна
чи декілька операцій модифікації, котрі запускають даний тригер. Параметр
WITH ENCRIPTING має той же зміст, що і для ПЗ, він ховає вихідний текст
тіла тригеру.
Існує декілька правил, котрі обмежують набір операторів, котрі можуть
бути використанні в тілі тригера. Так, у більшості СУБД діють наступні
обмеження:
- неможна використовувати в тілі тригера операції створення об’єктів БД (нової
БД, нової таблиці, нового індексу, новохПЗ, нового тригеру, нових індексів,
нових уявлень);
- неможна використовувати в тригері команду видалення об’єктєв DROP для
всіх типів базових об’єктsв БД;
- неможна використовувати в тілі тригера команди зміни базових об’єктів
ALTER TABLE. ALTER DATABASE;
- неможна змінювати права доступу до об’єктів БД, тобто виконувати команду
GRAND чи REVOKE;
- неможна створювати тригер для уявлення (VIEW) – це обмеження не діє в
InterBase;
- на відміну від ПЗ, тригер не може повертати ніяких значень, він запускається
автоматично сервером і не може звязуватися самостійно ні з жодним
клієнтом.

5
Створимо для таблиці STUDENT тригер, котрий буде підставляти в поле
person_id чергове унікальне значення:
SET TERM !! ;
CREATE TRIGGER person_id_gen FOR STUDENT
BEFORE INSERT AS
BEGIN
new.person_id = gen_ id(person_ id_gen, 1);
END !!
SET TERM ; !!

Виконаємо запит. Цей тригер буде спрацьовувати перед вставкою запису в


таблицю STUDENT, привласнюючи полю person_id унікальне значення,
отримане від генератору person_id_gen:
new.person_id = gen_id(person_id_gen, 1);

Наберемо запит:
INSERT INTO STUDENT(first_name, middle_name, last_name, start_date)
VALUES ('Сергей','Георгиевич','Тищенко','03.05.2000')

Тут у списку полів взагалі не вказується поле person_id: тепер в цьому


немає необхідності.
Для посилання значень полів, які містяться в кеші, в SQL-запитах
допускається використання параметрів, котрі перед виконанням запиту
замінюються на відповідні значення.
Параметри підчиняються наступним правилам:
• параметр починається з символу двокрапка,
• ім’я параметру повино співпадати з іменем колонки набору даних;
• ім’я параметру може мати префікс «OLD_», у цьому випадку параметр
замінюється значенням поля до редагування.

6
6.3 ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ
1. Створити тригери для таблиці і уявлення, ім’я яких вкаже викладач.
2. Перевірити роботу тригерів.

Варіанти лабораторної роботи 12


Створити тригери, вказані у варіантах:
Варіант 1. ДЕТАЛІ, ЗБУТ, БРИГАДИ. За допомогою тригерів
забезпечити, щоб при виведенні номера (списка) бригади, що виконали деталей
більше, ніж середній показник, цей номер (список) бригади автоматично
додавався в кінець.
Тригер повинен спрацьовувати до операціі DELETE для таблиці і після
операції – для уявлення.

Варіант 2. ВКЛАДНИКИ, РАХУНКИ, ДОВІДНИК. За допомогою


тригерів забезпечити, щоб при додаванні прізвища вкладника, який виграв по
виграшному вкладу, прізвище цього вкладника автоматично додається в кінець
списку.
Тригер повинен спрацьовувати до операціі INSERT для таблиці і після
операції – для уявлення.

Варіант 3. МОДЕЛІ, МАТЕРІАЛ, ЗБУТ. За допомогою тригерів


забезпечити неможливість збуту матеріалів більше ніж є в наявності.
Тригер повинен спрацьовувати до операціі UPDATE для таблиці і після
операції – для уявлення.

Варіант 4. ЛІТАКИ, ЕКІПАЖИ, ПОГОДА. За допомогою тригерів


забезпечити, щоб кілкість екіпажу не перевищувала місць у літаку.
Тригер повинен спрацьовувати після операціі DELETE для таблиці і до
операції – для уявлення.

7
Варіант 5. АБОНЕНТИ, ДОВІДНИК, ЗВ’ЯЗКІВЦІ. За допомогою тригерів
забезпечити, щоб абоненти не платили за телефон своїх сусідів.
Тригер повинен спрацьовувати після операціі INSERT для таблиці і до
операції – для уявлення.

Варіант 6. ПЕРЕДПЛАТНИКИ, ВИДАННЯ, ПОШТА. За допомогою


тригерів забезпечити неможливість отримання передплатником газети, якщо
він за неї не заплатив.
Тригер повинен спрацьовувати після операціі UPDATE для таблиці і до
операції – для уявлення.

Варіант 7. СТУДЕНТИ, ЛАБОРАТОРІЇ, РОЗКЛАД. За допомогою


тригерів забезпечити, щоб студенти однієї групи одночасно не могли бути в
декількох аудиторіях.
Тригер повинен спрацьовувати до операціі DELETE для уявлення і після –
для таблиці.

Варіант 8. ВОДІЇ, ВАНТАЖІ, ЗАМОВЛЕННЯ. За допомогою тригерів


забезпечити, щоб водії не могли постачати більше вантажа, ніж є в замовленні.
Тригер повинен спрацьовувати до операціі INSERT для уявлення і після –
для таблиці.

Варіант 9. БУДМАТЕРІАЛИ, ДОСТАВКА, ВИКОРИСТАННЯ


МАТЕРІАЛІВ. За допомогою тригерів забезпечити, щоб
Тригер повинен спрацьовувати до операціі UPDATE для уявлення і після –
для таблиці.

8
Варіант 10. НАДОЇ, ФУРАЖ, РЕЖИМ. За допомогою тригерів
забезпечити, щоб одній групі не можна було поставити фураж калорійностю
більше за задану кількість одиниць.
Тригер повинен спрацьовувати після операціі UPDATE для уявлення і
після – для таблиці.

Варіант 13. АБІТУРІЄНТИ, ФАКУЛЬТЕТИ, ІСПИТИ. За допомогою


тригерів забезпечити виключення з списків при одержанні незадовільної оцінки
Тригер повинен спрацьовувати до операціі DELETE для таблиці і після
операції – для уявлення.

Варіант 16. РИБОЛОВНА БРИГАДА, РЕСУРСИ, ЗБУТ. За допомогою


тригерів забезпечити, неможливість вилову риби більше ніж є в ресурсі.
Тригер повинен спрацьовувати до операціі INSERT для таблиці і після
операції – для уявлення.

Варіант 17. СЛУЖБОВЦІ, МОВИ ПРОГРАМУВАННЯ, ВОЛОДІННЯ


МОВАМИ ПРОГРАМУВАННЯ. З допомогою тригерів забезпечити, щоб у
таблиці службовців був тільки один директор (тип службовця «директор» и №
начальника NULL).
Тригер повинен спрацьовувати до операціі UPDATE для таблиці і після
операції – для уявлення.

Варіант 18. КНИГИ, ЧИТАЧІ, ВИДАНІ КНИГИ. З допомогою тригерів


забезпечити неможливість видачі більше екземплярів книги, ніж є у бібліотеці.
Тригер повинен спрацьовувати після операціі DELETE для таблиці і до
операції – для уявлення.

9
Варіант 19. ГРУПИ, СТУДЕНТИ, ОЦІНКИ. З допомогою тригерів
забезпечити, щоб при одержанні трьох двійок студент автоматично виключався
з списку групи.
Тригер повинен спрацьовувати після операціі INSERT для таблиці і до
операції – для уявлення.

Варіант 20. КНИГИ, АВТОРИ, АВТОРИ КНИГИ. З допомогою тригерів


забезпечити, щоб при додаванні нового запису в таблицю авторів книг цей
автор автоматично додовався в кінець списку.
Тригер повинен спрацьовувати до операціі DELETE для уявлення і після –
для таблиці.

Варіант 21. ПРЕДМЕТИ, ВИКЛАДАЧІ, ВИКЛАДАЧІ, ЩО ВЕДУТЬ


ПРЕДМЕТИ. З допомогою тригерів забезпечити, щоб викладач, що веде
предмет, був професором і читав цей предмет.
Тригер повинен спрацьовувати після операціі UPDATE для таблиці і до
операції – для уявлення.

Варіант 22. ПРЕДМЕТИ, ГРУПИ, ГРУПИ, ЩО ВИВЧАЮТЬ ПРЕДМЕТ. З


допомогою тригерів забезпечити, щоб одній групі не можна було поставити
більш 3-х предметів зі складністю більше 8.
Тригер повинен спрацьовувати до операціі UPDATE для уявлення і після –
для таблиці.

Варіант 23. ПОКУПЦІ, ТОВАРИ, ЗАМОВЛЕННЯ. З допомогою тригерів


забезпечити, щоб не можна було оформити замовлення на товар, на який не
зазначена ціна. Додати в таблицю замовлень поле ЦІНА, автоматично
враховуючі знижку (завдання на денормалізацію)

10
Варіант 24. КІМНАТИ, СТУДЕНТИ, СТУДЕНТ, ЩО МЕШКАВ. З
допомогою тригерів забезпечити, щоб кількість проживаючих у кімнаті не
перевищувала місткості цієї кімнати.
Тригер повинен спрацьовувати після операціі UPDATE для уявлення і
після – для таблиці.

Варіант 26. ДІАГНОЗ, ХВОРИЙ, ХВОРОМУ НАДАНИЙ ДІАГНОЗ. За


допомогою тригерів забезпечити, щоб було неможливо поставити діагноз
раніше, ніж пацієнт народився.
Тригер повинен спрацьовувати до операціі UPDATE для таблиці і після
операції – для уявлення.

6.4 МЕТОДИКА ВИКОНАННЯ


Методика виконання даної лабораторної роботи подібний до методики
виконання лабораторної роботи №5.

6.5 ЗМІСТ ЗВІТУ


Розділ “Результати роботи” повинен містити скріпти і результати запитів.

6.6 КОНТРОЛЬНІ ПИТАННЯ:


1. Чи можна змінити тригер?
2. Коли виконуються тригери - до чи після виконання команд INSERT,
UPDATE та DELETE?

11

You might also like