Создание триггерной функции
Триггерная функция определяется командой 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_addition() вызывается после выполнения операции 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
Дата добавления: 2015-02-03; просмотров: 1479;