Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fondovi-lekcii.doc
Скачиваний:
20
Добавлен:
10.11.2018
Размер:
4.09 Mб
Скачать

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

Як уже відмічалося вище, тригер схожий на цензора, що безцеремонно оглядає усе, що відноситься до цікавлячого його предмету. Інтерес нашого тригера описаний сполученням ключових слів 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.

Контрольні питання:

Що таке збережувана процедура?

Який синтаксис збережуваних процедур?

Яка команда створює лічильник?

Що виконує індекс? Коли доцільно використовувати індекси?

Що таке виключення? Яка його структура?

Що таке тригер?

Які контекстні змінні використовуються в тригерах?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]