Создание триггерной функции

Триггерная функция определяется командой SQL CREATE FUNCTION без аргументов и возвращает значение специального типа данных trigger. Синтаксис определения трнггерной функции PL/pgSQL командой CREATE FUNCTION приведен в листинге 6.43.

Листинг 6.43. Определение триггерной функции

CREATE OR REPLACE FUNCTION функция ()

RETURNS trigger AS '

DECLARE

объявления;

[...]

BEGIN

команды;

[...]

END;

' LANGUAGE 'plpgsql':

В триггерных функциях используются специальные переменные, содержащие информацию о сработавшем триггере. С помощью этих переменных триггерная функция работает с данными таблиц. Специальные переменные триггерных функций перечислены в таблице 6.2.

Таблица 6.2. Специальные переменные в триггерных функциях

Имя Тип данных Описание
NEW RECORD Новая запись базы данных, созданная командой INSERT или UPDATE при срабатывании триггера уровня записи (ROW). Переменная используется для модификации новых записей
OLD RECORD Старая запись базы данных, оставшаяся после выполнения команды INSERT или UPDATE при срабатывании триггера уровня записи (ROW)
TGNAME name Имя сработавшего триггера
TG_WHEN text Строка BEFORE или AFTER в зависимости от момента срабатывания триггера, указанного в определении (до или после операции)
TG_LEVEL text Строка ROW или STATEMENT в зависимости от уровня триггера, указанного в определении
TG_OP text Строка INSERT, UPDATE или DELETE в зависимости от операции, вызвавшей срабатывание триггера
TG_RELID old Идентификатор объекта таблицы, в которой сработал триггер
TG_RELNAME name Имя таблицы, в которой сработал триггер
TG_NARGS Integer Количество аргументов триггерной функции, указанных в определении триггера
TG_ARGV[] Массив text Аргументы, указанные в команде CREATE TRIGGER. Индексация массива начинается с нуля

В листинге 6.44 приведен пример определения трнггерной функции PL/pgSDL, использующей некоторые из перечисленных переменных. Триггерная функция check_shipment_ad­dition() вызывается после выполнения операции INSERT или UPDATE с таблицей shipments.

Функция check_shipment_addition() убеждается в том, что каждая новая запись содержит действительный код покупателя и код ISBN книги. Затем общее количество экземпляров в таблице stock уменьшается на 1, если триггер сработал по команде SQL INSERT (но не по команде UPDATE!)

Листинг 6.44. Триггерная функция check_shipment_addition()

CREATE OR REPLACE FUNCTION books.check_shipment_addition()

RETURNS trigger AS

$BODY$

DECLARE

-- Объявление переменной для хранения кода покупателя.

id_number integer;

-- Объявление переменной для хранения кода ISBN.

book_isbn text;

BEGIN

-- Если в таблице customers существует код, совпадающий с кодом

-- покупателя в таблице new, присвоить его переменной id_number.

SELECT INTO id_number id FROM books.customers WHERE id = NEW.customer_id;

-- Если совпадение не найдено, инициировать исключение.

IF NOT FOUND THEN

RAISE EXCEPTION 'Invalid customer ID number.';

END IF;

-- Если в таблице editions существует код ISBN, совпадающий с кодом

-- ISBN в таблице new, присвоить его переменной book_isbn.

SELECT INTO book_isbn isbn FROM books.editions WHERE isbn = NEW.isbn;

-- Если совпадение не найдено, инициировать исключение.

IF NOT FOUND THEN

RAISE EXCEPTION 'Invalid ISBN.';

END IF;

-- Если обе предыдущие проверки завершились успешно,

-- обновить количество экземпляров.

IF TG_OP = 'INSERT' THEN

UPDATE books.stock SET stock = stock -1 WHERE isbn = NEW.isbn;

END IF;

RETURN NEW;

END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE


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



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