Тригери - Студопедія

Фактично тригер - це спеціальний вид процедури, що зберігається, яку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)дуже потрібно