Тригери - Студопедія
Фактично тригер - це спеціальний вид процедури, що зберігається, якуSQL Server викликає при виконанні операцій модифікації відповідних таблиць. Тригер автоматично активізується під час виконання операції, з якою він пов'язаний. Тригери зв'язуються з однією чи кількома операціями модифікації над однією таблицею.
У різних комерційних СУБД розглядаються різні тригери. Так, у MS SQL Server тригери визначені лише як постфільтри, тобто такі тригери, які виконуються після події.
У СУБД Oracle визначено два типи тригерів: тригери, які можуть бути запущені перед реалізацією операції модифікації, вони називаються BEFORE-тригерами і тригери, які активізуються після виконання відповідної модифікації, аналогічно тригерам MS SQL Server, - вони називаються AFTER-тригерами.
Тригери можуть бути ефективно використані для підтримки семантичної цілісності БД, проте пріоритет їх нижчий, ніж пріоритет правил-обмежень (constraints), що задаються на рівні опису таблиць і на рівні зв'язків між таблицями. При написанні тригерів завжди треба пам'ятати про це, при порушенні правил цілісності зв'язків (DRI declarative Referential Integrity) тригер просто може ніколи не спрацювати.
У стандарті SQL1 ні процедури, що зберігаються, ні тригери були не визначені. Але у додаванні до стандарту SQL2, випущеному 1996 року, ті та інші об'єкти були стандартизовані та визначені.
Для створення тригерів використовується спеціальна команда:
CREATE TRIGGER ON
SQL-оператори (Тіло тригера)
Ім'я тригера є ідентифікатором у вбудованій мові програмування СУБД і має відповідати відповідним вимогам.
У параметрі FOR задається одна або кілька операціймодифікації, які запускають цей тригер.
Параметр WITH ENCRIPTING має той самий сенс, що і для процедур, що зберігаються, він приховує вихідний текст тіла тригера.
Існує кілька правил, які обмежують набір операторів, які можуть бути використані у тілі тригера.
Так, у більшості СУБД діють такі обмеження:
- Не можна використовувати в тілі тригера операції створення об'єктів БД (нової БД, нової таблиці, нового індексу, нової процедури, що зберігається, нового тригера, нових індексів, нових уявлень).
- У тригері не можна використовувати команду видалення об'єктів DROP для всіх типів базових об'єктів БД.
- Не можна використовувати у тілі тригера команди зміни базових об'єктів ALTER TABLE, ALTER DATABASE.
- Не можна змінювати права доступу до об'єктів БД, тобто виконувати команду GRAND або REVOKE.
- Не можна створити тригер для подання (VIEW).
- На відміну від процедур, що зберігаються, тригер не може повертати ніяких значень, він запускається автоматично сервером і не може зв'язатися самостійно з жодним клієнтом.
Розглянемо приклад тригера, який спрацьовує при видаленні екземпляра деякої книги, наприклад, у разі втрати книги читачем. Що може робити цей тригер? А він може виконувати таку перевірку: перевіряти, чи залишився ще хоч один екземпляр цієї книги в бібліотеці, і якщо це був останній екземпляр книги в бібліотеці, то резонно видалити опис книги з предметного каталогу, щоб наші читачі даремно не намагалися замовити цю книгу.
Текст цього тригера на мові Transact SQL наведено нижче:
/* Перевірка існування цього тригера в системному каталозі */
if exists (select * from sysobjects
where ) and sysstat& Oxf = 8)
drop trigger dbo.DEL_EXEMP
CREATE TRIGGER DEL_EXEMP ON dbo.EXEMPLAR
/* ми створюємо тригер для таблиці EXEMPLAR */
FOR DELETE /* тільки для операції видалення */
/* Опишемо локальні змінні */
DECLARE @Ntek int
/* кількість екземплярів видаленої книги, що залишилися */
DECLARE @DEL_EX VARCHAR(12)
/* шифр віддаленого екземпляра*/
/* за тимчасовою системною таблицею, що містить видалені записи, визначаємо шифр книги, що відповідає останньому віддаленому примірнику */
SELECT @DEL_EX = ISBN Від deleted
/* викличемо збережену процедуру, яка визначить кількість екземплярів книги із заданим шифром */
ЄХЕС @Ntek = COUNT_EX @DEL_EX
/* Якщо більше немає екземплярів цієї книги, то ми видаляємо запис про книгу з таблиці BOOKS */
IF @Ntek = 0 DELETE from BOOKS WHERE BOOKS.ISBN = @DEL_EXENDGO
Чи не знайшли те, що шукали? Скористайтеся пошуком:
Вимкніть adBlock! і оновіть сторінку (F5)дуже потрібно