Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка_работа_с_PostgreSQL.doc
Скачиваний:
28
Добавлен:
10.11.2019
Размер:
5.91 Mб
Скачать

6.2Триггеры бд

Триггер БД – это процедура, которая хранится в виде объекта БД и выполнение которой неявно инициируется при наступлении определенных событий. Как правило, такими событиями являются изменения в состоянии БД, которые инициируются предложениями INSERT, UPDATE, DELETE.

Следует отметить, что триггер в PostgreSQL – это связь триггерной функции с одной (или несколькими) из операций модификации, выполняемых над таблицей (UPDATE, INSERT, DELETE), автоматически запускающая эту функцию при получении соответствующего запроса. То есть, с каждым триггером должна быть связана триггерная функция.

В PostgreSQL Триггерная функция отличается от функции тем, что тип ее результата – trigger.

6.2.1Синтаксис определения триггера в PostgreSql

Синтаксис определения триггера в PostgreSQL следующий:

CREATE TRIGGER имя_триггера время_инициирования_триггера

событие_триггера ON имя_таблицы

уровень_триггера

EXECUTE ROCEDURE заголовок_триггерной_функции;

Имя триггера. Имя триггера должно быть уникальным среди имен триггеров схемы БД.

Время инициирования триггера. При определении триггера предоставляется возможность указать момент инициирования его выполнения, а именно – должен ли триггер быть инициирован перед выполнением события (фраза BEFORE) или после (фраза AFTER).

Событие триггера. В качестве событий триггера могут выступать только изменения состояний БД. Они, естественно, связаны с командами вставки, изменения и удаления строк таблицы.

Имя таблицы. Имя таблицы БД, причем только одной.

Уровень триггера. Уровень триггера определяется одной из следующих фраз: FOR EACH ROW или FOR EACH STATEMENT. Тем самым можно указать, сколько раз триггер будет выполняться по отношению к инициирующему его событию. Возможны два варианта:

  1. По одному разу относительно каждой строки, которая будет подвергнута воздействию события триггера (фраза FOR EACH ROW);

  2. Один раз относительно события независимо от того, сколько строк он обрабатывает (фраза FOR EACH STATEMENT).

Заголовок триггерной функции. Указывается триггерная функция, которая будет выполняться при инициализации триггера.

Во время работы триггера доступны специальные переменные: OLD (запись перед обновлением или перед удалением), NEW (запись, которая будет вставлена или обновлена). Более наглядно использование этих переменных приведено в таблице 6.1.

Таблица 6.1 – Использование переменных OLD и NEW

Событие

Переменная

UPDATE

OLD, NEW

INSERT

NEW

DELETE

OLD

6.2.2Создание триггера в PgAdmin III

Рассмотрим процесс создания триггера в pgAdmin III на конкретном примере.

Пример 1: При добавлении записи в таблицу Marks БД «Деканат ВУЗа» необходимо автоматически пересчитывать средний балл студента (колонка SrBall в таблице Students).

Первоначально необходимо написать триггерную функцию, которая будет подсчитывать средний балл студента по таблице Marks и обновлять соответствующую запись в таблице Students. Для этого в окне Браузер объектов для БД «Деканат ВУЗа» необходимо выделить раздел Триггерные функции и активизировать соответствующее контекстное меню (рисунок 6.5).

Рисунок 6.5 – Контекстное меню раздела Триггерные функции

В результате откроется окно создания новой триггерной функции (рисунок 6.6).

Рисунок 6.6 – Окно Новая триггерная функция. Закладка Свойства

На закладке Свойства необходимо указать следующие параметры:

  1. Имя – имя триггерной функции (для примера update_SrBall), должно быть уникальным среди имен триггерных функций схемы БД;

  2. Владелец – postgres;

  3. Язык – процедурный язык (plpgsql);

  4. Временность – VOLATILE [7] указывает на то, что значение функции может изменяться в пределах одного сканирования таблицы (используется по умолчанию);

На закладке Определение вводится "тело" функции (рисунок 6.7):

Рисунок 6.7 – Закладка Определение окна Новая триггерная функция

Полный код функции можно просмотреть на закладке SQL (рисунок 6.8).

Рисунок 6.8 – Закладка SQL окна Новая триггерная функция

После этого необходимо создать триггер. Для этого в окне Браузере объектов нужно выбрать таблицу Marks, активизировать ее контекстное меню и в нем выбрать пункт Новый триггер (рисунок 6.9).

Рисунок 6.9 – Контекстное меню раздела Триггеры

В результате открывается окно создания нового триггера (рисунок 6.10).

Рисунок 6.10 – Окно Новый триггер. Закладка Свойства

В свойствах нового триггера необходимо указать следующее:

  • Имя – имя нового триггера;

  • свойство Строчный триггер задает уровень триггера: FOR EACH ROW (свойство выбрано) или FOR EACH STATEMENT (свойство не выбрано).

  • Триггерная функция – функция, которая будет выполняться при срабатывании триггера (выбирается из выпадающего списка);

  • свойство Срабатывает указывает момент инициирования триггера, а именно – должен ли триггер быть инициирован перед выполнением события (BEFORE) или после (AFTER);

  • События – указывается событие, по которому инициируется триггер. Важно подчеркнуть, что для одного триггера можно выбрать как одно событие, так и несколько.

Проверить работу триггера можно при добавлении новой записи в таблицу Marks (рисунок 6.11). Автоматически будет изменено значение колонки SrBall таблицы Students для заданного студента (рисунок 6.12).

Рисунок 6.11 – Содержимое таблицы Marks

Рисунок 6.12 – Содержимое таблицы Students