Учебное пособие / Lab8
.doc
Лабораторна робота № 8
ТЕМА РОБОТИ: Тригери.
МЕТА РОБОТИ: Навчитися створювати, використовувати й видаляти тригери.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Тригери - це реалізований в SQL-Server спосіб забезпечення цілісності даних у базі. Оскільки тригери дозволяють реалізувати механізм установки правил не на рівні окремо взятих додатків, а на рівні бази даних у цілому, їх корисно використати в тих базах даних, до яких будуть звертатися з різних додатків.
SQL-Server здатний здійснювати контроль за логікою роботи додатка й проходженням даних по таблицях. Саме на цій основі будуються його можливості ефективного керування інформацією.
SQL-Server розглядає правила й стандартні значення (і на цій основі приймає відповідні рішення) перше ніж записує інформацію в базу даних. Це щось начебто «попереднього фільтра», що відсіває інформацію, що не задовольняє деяким умовам.
Із цього погляду, тригери - це «фільтри післядії», які набувають чинності після виконання всіх операцій, пов'язаних із правилами, стандартними значеннями й т.д.
Тригери - це особливий тип збереженої процедури, що SQL-Server виконує при вставці, модифікації й видаленні даних у деяких таблицях. Тригери запускаються в саму останню чергу. Якщо робота тригера завершується аварійно, то інформація в базі даних не обновляється й у відповідь на спробу завершити транзакцію додатку повертається повідомлення про помилку.
Найпоширеніше застосування тригерів - це перевірка складних критеріїв у базі даних. Тригери використаються, коли стандартних обмежень і декларативних табличних засобів по забезпеченню умов цілісності даних уже не досить.
Тригери роблять дуже незначний вплив на продуктивність сервера й часто використається для розширення можливостей додатків, які повинні виконувати безліч каскадних операцій над іншими таблицями й рядками.
Створення тригерів
Створити тригер може тільки власник бази даних. Додаючи тригер до стовпця, рядку або таблиці, ви міняєте спосіб доступу до таблиці, спосіб зв'язку з нею інших об'єктів.
Створення тригерів багато в чому нагадує оголошення збереженої процедури, тому й синтаксис цих двох процесів має багато загального.
CREATE TRIGGER [власник.] ім'я_тригера
ON [ власник. ] ім'я_таблиці
FOR {INSERT, UPDATE, DELETE}
[WITH ENCRIPTION]
AS оператори_SQL
Опис команди CREATE TRIGGER.
1. Ім'я_тригера. Ім'я тригера повинне задовольняти стандартним угодам про іменування об'єктів SQL-Server.
-
INSERT (Вставити), UPDATE (Обновити), DELETE (Видалити). Область застосування тригерів вичерпується цими ключовими словами. Тільки ці операції можуть ініціювати виконання тригера.
-
WITH ENCRIPTION (Із шифруванням). Дана опція призначена для того, щоб не дозволити користувачам у їхньому робітничому середовищі прочитати текст тригера після розміщення його на сервері. Це дуже зручна можливість для розроблювачів додатків, які створюють свої продукти для середовища SQL-Server і не хочуть, щоб замовники могли дизасемблювати код і модифікувати його.
-
Оператори_SQL. Тригер може містити довільне число операторів Transact- SQL, за умови, що вони укладені між парними операторами BEGIN й END.
Приклад створення тригера:
Для цього приклада створимо наступні дві таблиці:
-
ім'я таблиці TABLE1.
використовувані поля:
MYID INT, MYNAME CHAR(15).
-
ім'я таблиці TABLE2.
використовувані поля:
MYID INT, MYVALUE SMALLMONEY.
Для створення тригера INSCHECK за допомогою утиліти SQL Server Enterprise Manager необхідно вибрати таблицю TABLE2 у списку об'єктів бази даних, після чого виконати команду All tasks / Manage Triggers меню Action. Дані дії приведуть до відкриття діалогового вікна властивостей тригера. У дане діалогове вікно введіть наступний текст:
CREATE TRIGGER INSCHECK ON TABLE2
FOR INSERT
AS
DECLARE @X INT
SELECT @X = I.MYID FROM TABLE2 A,
INSERTED I WHERE A.MYID = I.MYID
IF NOT (EXISTS (SELECT * FROM
TABLE1 WHERE MYID = @X))
BEGIN
ROLLBACK TRAN
RAISERROR ('ПОМИЛКА ЦІЛІСНОСТІ ! ! !',16,10)
END
Приклад створення тригера, що дозволяє видаляти всі залежні записи з таблиці TABLE2 при видаленні запису з таблиці TABLE1.
CREATE TRIGGER DELCHECK ON TABLE1
FOR DELETE
AS
DECLARE @X INT
SELECT @X = D.MYID FROM TABLE1 A,
DELETED D WHERE A.MYID = D.MYID
IF EXISTS (SELECT * FROM
TABLE2 WHERE MYID = @X)
DELETE FROM TABLE2 WHERE MYID = @X
Використання тригерів
Тригери операторів INSERT й UPDATE є особливо корисними, тому що вони дозволяють підтримувати цілісність даних і перевірити їхню допустимість до уведення в таблицю. Звичайно ці тригери використаються для перевірки того, що дані задовольняють заданому критерію, або для відновлення стовпців-лічильників.
Тригер оператора DELETE звичайно використовується по двох причинах. По-перше, щоб запобігти видаленню записів, якщо це може привести до порушення цілісності даних, наприклад, у випадку, коли деякі поля записи використаються як ключі для інших таблиць.
По-друге, тригер оператора DELETE часто використається для виконання каскадної операції видалення, тобто коли слідом за основним набором записів потрібно видалити й основні записи.
Використання вкладених тригерів
В SQL-Server 7.0 можна використати до 16 рівнів вкладення тригерів. Але якщо подібне вкладення тригерів є небажаним, то його можна заборонити, відповідним чином сконфігував SQL-Server. Для цієї мети використається процедура sp_configure.
Вкладення тригерів означає наступне: один тригер модифікує таблицю, а для неї визначений інший тригер, що у результаті починає виконуватися.
Під час створення тригера SQL-Server не може виявити вкладення SQL-Server не може виявити вкладення, що стане причиною нескінченного зациклення ; це може з'ясуватися тільки під час виконання. Зациклення може відбутися у випадку, якщо Trigger_A виконує відновлення таблиці Table_A, а це, у свою чергу, викликає відновлення таблиці Table_B. У той же час у таблиці Table_B є аналогічний тригер Trigger_B, що запускається у випадку відновлення Table_B і викликає відновлення Table_A. Таким чином, якщо користувач обновить одну із цих таблиць, те два зазначених тригери будуть запускати один одного нескінченно. Якщо SQL-Server виявить подібну ситуацію, то він перерве виконання тригерів.
Видалення тригерів
Існує ряд причин, по яких необхідно видалити тригери з таблиці. Припустимо, ви переходите до іншої діючої бази даних і хочете видалити всі тригери, які забезпечували гарний рівень надійності, але трохи знижували продуктивність.
DROP TRIGGER [ власник.] [ , [ ім'я_тригера . . . ] ]
Зовсім не обов'язково видаляти старий тригер, якщо необхідно замінити його на новий. Також, при видаленні таблиці всі її дочірні об'єкти зокрема, тригери, теж віддаляються.
ПОРЯДОК ПРОВЕДЕННЯ ЛАБОРАТОРНОЇ РОБОТИ
-
Вивчити теоретичні відомості
-
Створити тригер на вставку данних.
-
Створити тригер на заміну данних.
-
Створити тригер на вилучення данних.
-
Перевірити роботу створених тригерів.
-
Створити вкладені тригери.
-
Вилучити тригери.
-
Предоставити письмовий звіт по роботі.
ПИТАННЯ ДЛЯ САМОПЕРЕВІРКИ
-
Дайте визначення терміну “тригер”?
-
Для чого використовуються тригери?
-
Як створити тригер?
-
Які обмеження накладаються при створенні тригерів?
-
Порівняйте тригера та збережені процедури. Що в них спільного та відмінного?
-
Опишіть команду CREATE TRIGGER..
-
Яку кількість операторів може містити трігер?
-
Які операції можуть ініціювати виконання тригера?
-
Яка опція дозволяє користувачам прочитати текст тригера після розміщення його на сервері?
-
Наведіть приклад створення тригера. Які дії необхідно для цього виконати?
-
Для чого призначені тригери операторів INSERT й UPDATE?
-
Для чого призначений тригер оператора DELETE?
-
Що означає вкладення тригерів?
-
Як заборонити вкладення тригерів?
-
Як видалити тригери з таблиці?