Active before insert position 0

AS

BEGIN

IF (NEW. ID IS NULL) THEN

NEW. ID = GEN_ID (GEN_TABLE_EXAMPLE_ID,1);

END

 

Давайте докладно розберемо "будову" тригера.

 

Опис команди створення тригера починається з ключових слів CREATE TRIGGER, після яких з’являється ім'я тригера – Table_example_bi. Потім слідує ключове слово FOR, після якого зазначене ім'я таблиці, для якої створюється тригер, – Table_example.

 

На другому рядку команди приводиться опис сутності тригера – ключове слово ACTIVE указує, що тригер є "активним". Тригер також може бути переведений у стан INACTIVE. Це означає, що він буде зберігатися в базі даних, але він не буде спрацьовувати. Сполучення ключових слів BEFORE INSERT визначає, що тригер спрацьовує ДО ВСТАВКИ; а ключове слово POSITION і число 0 указують черговість (позицію) створюваного тригера серед тригерів того ж типу для даної таблиці. Позиція тригера потрібна тому, що в InterBase можливо створити більш 32000 тригерів кожного виду (наприклад, BEFORE INSERT чи AFTER UPDATE), і серверу потрібно вказати, у якому порядку ці тригери будуть виконуватися. Тригери з меншою позицією виконуються першими. Якщо є декілька тригерів з однакової позицією, то вони будуть виконуватися за абеткою.

 

Усе розглянуте вище до ключового слова AS утворює заголовок тригера. Після AS слідує тіло тригера. Власне в тілі і здійснюється вставка значення в поле первинного ключа. Але спочатку за допомогою вже знайомого вам оператора IF...THEN перевіряється, чи не було заповнено це поле на клієнті. Вираз перевірки, що повертає булеву TRUE (істина) чи FALSE (неправда), виглядає так:

 

NEW. ID IS NULL

Тут NEWконтекстна змінна.

 

Контекстні змінні.

Якуже відмічалося вище, тригер схожий на цензора, що безцеремонно оглядає усе, що відноситься до цікавлячого його предмету. Інтерес нашого тригера описаний сполученням ключових слів BEFORE INSERT – це значить, що всі операції вставки (INSERT) викликають спрацьовування тригера. Причому він спрацює ДО (BEFORE) того, як вставка фізично здійснена. Тобто в момент спрацьовування тригера дані, прислані ким-небудь на вставку, ще не занесені в таблицю. Вони знаходяться в деякому проміжному буфері. І в тригера є можливість звертатися до цього буфера, щоб перевірити і/або змінити значення даних – кандидатів на вставку. Ця можливість реалізована за допомогою контекстної змінної NEW. Можна розглядати цю змінну як структуру (щось подібне struct у Сі чи record у Pascal), елементи якої являють собою значення, прислані для здійснення операції (INSERT у нашому прикладі). Тобто усередині тригерамиможемо звернутися до всіх полів ще не вставленого запису, використовуючи для цього звертання: New. ID, New. NAME і New. PRICE_l.

 

Ми можемо довідатися значення кожного поля запису, що вставляється, порівняти його чи змінити. Це власне і робиться в цьому фрагменті коду:

 

IF (NEW. ID IS NULL) THEN

NEW. ID = GEN_ID (GEN_TABLE_EXAMPLE_ID,1);

 

Спочатку в операторі IF...THEN перевіряємо ідентифікатор ID на наявність якого-небудь значення, адже він може бути згенерований на клієнті. Якщо значенням NEW. ID є NULL, то викликаємо функцію GEN_ID, що збільшує значення генератора GEN_TABLE_EXAMPLE_ID на одиницю і потім повертає отримане число, що привласнюється полю NEW. ID. Таким чином, ми "на льоту" змінили значення в записі, що вставляється!

 

Крім контекстної змінної NEW, існує її дзеркальний аналог – змінна OLD. На відміну від NEW, OLD містить старі значення запису, що вилучаються чи змінюються. Наприклад, ми можемо використовувати змінну OLD для одержання значень записів, що вилучаються з таблиці:

 

CREATE TRIGGER Table_example_ad0 FOR Table_example

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

IF (OLD. id>1000) THEN

BEGIN

/*..виконуємо певні дії..*/

OLD. ID=10;

END

END

 

Тут ми створюємо тригер, що спрацьовує ПІСЛЯ ВИЛУЧЕННЯ (AFTER DELETE). Як бачите, ми можемо одержати доступ до уже вилучених даних. Звичайно, присвоєння OLD. ID=10; немає жодного змісту – присвоєне значення пропаде на виході з тригера. Однак цей приклад показує, що ми можемо перехопити значення, що вилучаються, і записати, наприклад, у деяку таблицю, де зберігається історія всіх змін.

 

Використання контекстних змінних часто викликає безліч питань. Справа в тім, що в різних видах тригерів NEW і OLD використовуються по-різному, а в деяких їх узагалі неможливо використовувати. Якщо ми розглянемо тригер у нашому прикладі, то він викликається ДО ВСТАВКИ. Про які значення OLD може йти мова? Адже вставляється зовсім новий запис! І дійсно, контекстна змінна OLD не може бути використана в тригерах BEFORE/AFTER INSERT. А змінна NEW не може бути використана в BEFORE/AFTER DELETE. Обидві ці змінні одночасно можуть бути використані в тригерах BEFORE/AFTER UPDATE, причому змінювати що-небудь можна, тільки використовуючи змінну NEW.

 

З А В Д А Н Н Я

Всі видані завдання стосуються бази даних Sales, яку ви створили.

1. Створіть тригер TCUSTOMER_ID для таблиці CUSTOMER, за допомогою якого вставляється в поле Customer_ID значення генератора.

2. Створіть тригер TITEM_NO для таблиці ITEMS, за допомогою якого вставляється в поле item_No значення генератора.

3. Оформіть звіт по роботі.

 

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

1. Що являє собою тригер?

2. Яку роль відіграють контекстні змінні NEW і OLD в тригерах?

3. Коли доцільно використовувати тригери?

4. Яка команда SQL створює тригер?

 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: