Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 3
16 Тригери
PostgreSQL підтримує нестандартні розширення SQL, які називаються тригерами (trigger). Тригер спрацьовує автоматично при виконанні над таблицею команд SQL INSERT, UPDATE або DELETE і запускає функцію, яка буде виконуватися до або після цих операцій.
Механізм обмежень PostgreSQL (CONSTRAINT) дозволяє реалізувати прості порівняння вхідних даних із статичними значеннями, але іноді перевірка повинна проводитися за більш складними критеріями. Це типовий приклад ситуації, в якій зручно скористатися тригером.
Визначення тр має такий вигляд:
CREATE TRIGGER тригер { BEFORE | AFTER } { подія [ OR подія ] } ON таблиця
FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE функція( аргументи )
Нижче подаються короткі описи компонентів цього визначення:
Таблиця 1 Структура системної таблиці pg_trigger
Імя поля таблиці pg_trigger |
Тип поля |
Опис змінної |
tgrelid |
oid |
Системний ідетифікатор запису таблиці, яку обслуговує тригер |
tgname |
name |
Імя тригера |
tgfoid |
oid |
|
tgtype |
smallint |
|
tgenabled |
“char” |
|
tgisconstraint |
old |
|
tgconstrname |
name |
|
tgconstrrelid |
oid |
|
tgdeferrable |
boolean |
|
tginitdeferred |
boolean |
|
tgnargs |
smallint |
|
tgattr |
int2vector |
|
tgargs |
bytea |
Отримати інформацію про існуючі тригери можна із системної таблиці pg_trigger, структура якої приведена в таблиці 1. Більшість її полів у запитах прямо не використовуються. Серед атрибутів тригера центральне місце займають tgrelid і tgname. У полі tgrelid зберігається ідентифікатор відношення, з яким повязаний даний тригер.
Створення або видалення тригера дозволено лише суперкористувачу або власнику бази даних. Команда видалення тригера має такий вигляд:
DROP TRIGGER імя ON таблиця
У прикладі 1 показано видалення тр check_ship, встановленого для таблиці ship.
Приклад 1 Видалення тригера
DROP TRIGGER check_ship ON ship;
Зауважимо, що при видаленні вказується не тільки імя тригера, але й імя таблиці.
Імя таблиці, для якої був установлений тригер, при необхідності можна прочитати з системних таблиць PostgreSQL. Наприклад, можна провести обєднання полів tgrelid системної таблиці pg_trigger і поля relfilenode системної таблиці pg_class та порівняти імя тригера з полем tgname. Запит, приведений у прикладі 2, повертає імя таблиці (relname), звязаної з тригером check_ship. Як видно з результатів запиту, це одна таблиця ship.
Приклад 2 Отримання імені таблиці, повязаної з тригером check_ship
SELECT relname FROM pg_class
INNER JOIN pg_trigger ON (tgrelid = relfilenode)
WHERE tgname = 'check_ship';
relname
-----------
ship
(1 row)
Визначення тригера PostgreSQL може містити посилання на тригерну функцію, тобто функцію, яка повинна викликатися при спрацьовуванні тригера. Не слід плутати визначення тригера з визначенням функції. Тригер визначається командою SQL CREATE TRIGGER, а тригерна функція CREATE FUNCTION.
Тригерна функція повинна бути визначена до визначення тригера, який її викликає. Тригерні функції завжди визначаються раніше, ніж тригери.
При видаленні функції, яку викликає тригер, він перестає працювати, причому повторне визначення функції з тим же імям не виправить проблему. Після повторного створення функції тригер також доводиться створювати наново.
Тригерна функція визначається без аргументів і повертає значення спеціального типу даних trigger. Це запис, він має ту ж структуру, що й таблиця, яка викликала тригер. Синтаксис тригерної функції має такий вигляд:
CREATE FUNCTION імя_функції() RETURNS trigger AS
$$
DECLARE
оголошення;
BEGIN
команди;
END;
$$
LANGUAGE 'plpgsql';
У тригерних функціях використовуються спеціальні змінні, які створюються автоматично і містять інформацію про спрацювання тригера. Вони перераховані в таблиці 2.
Таблиця 2 Спеціальні змінні тригерних функцій
Імя змінної |
Тип змінної |
Опис |
NEW |
record |
Новий запис бази даних, створений командою INSERT або UPDATE при спрацюванні тригера рівня запису (ROW). Змінна використовується для модифікації нових записів |
OLD |
record |
Старий запис бази даних, який запамятався після виконання команд INSERT або UPDATE при спрацюванні тригера рівня запису (ROW) |
TG_NAME |
name |
Імя тригера |
TG_WHEN |
text |
Рядок BEFORE або AFTER, в залежності від момента спрацьовування тригера, зазначеного у визначенні (до або після операції) |
TG_LEVEL |
text |
Рядок ROW або STATEMENT, в залежності від рівня тригера, зазначеного у визначенні |
TG_OP |
text |
Слово INSERT, UPDATE, DELETE або TRUNCATE, в залежності від операції, яка викликала тригер |
TG_RELID |
oid |
Ідентифікатор обєкта таблиці, в якій спрацював тригер |
TG_RELNAME |
name |
Імя таблиці, в якій спрацював тригер (застаріле). |
TG_TABLE_NAME |
name |
Імя таблиці, в якій спрацював тригер (версія 9.0 Beta) |
TG_TABLE_SCHEMA |
name |
Імя схеми (версія 9.0 Beta) |
TG_NARGS |
integer |
Кількість аргументів тригерної функції, зазначених у визначенні тригера |
TG_ARGV[ ] |
text |
Масив аргументів, зазначених у команді CREATE TRIGGER. Індексація масиву починається з нуля |
Слід наголосити на тому, що функція повинна бути оголошена без аргументів, навіть якщо вона розрахована на отримання аргументів, зазначених у інструкції CREATE TRIGGER. Аргументи тригера, якщо вони є, передаються через масив tg_argv[].