Базы данных. Концепция баз данных, реляционная модель данных, языки SQL и XML. Токмаков Г.П. - 150 стр.

UptoLike

Составители: 

150
Имя Тип данных Описание
отоперации,вызвавшейсрабатываниетриггера
TG_RELID old Идентификаторобъектатаблицы,вкоторойсрабо‐
талтриггер
TG_RELNAME name Имятаблицы,вкоторойсработалтриггер
TG_NARGS Integer Количествоаргументовтриггернойфункции,ука‐
занныхвопределениитриггера
TG_ARGV[] Массивtext Аргументы,указанныевкомандеCREATETRIGGER.
Индексациямассиваначинаетсяснуля
В листинге 6.48 приведен пример определения трнггерной функции
PL/pgSDL, использующей некоторые из перечисленных переменных. Триггерная
функция
check_shipment_addition() вызывается после выполнения операции
INSERT или UPDATE с таблицей shipments.
Функция
check_shipment_addition() убеждается в том, что каждая новая
запись содержит действительный код покупателя и код
ISBN книги. Затем об-
щее количество экземпляров в таблице
stock уменьшается на 1, если триггер
сработал по команде
SQL INSERT (но не по команде UPDATE!)
Листинг 6.48. Триггерная функция check_shipment_addition()
CREATEFUNCTIONcheck_shipment_addition()RETURNSopaqueAS'
DECLARE
‐‐Объявлениепеременнойдляхранениякодапокупателя.
id_numberinteger;
‐‐ОбъявлениепеременнойдляхранениякодаISBN.
book_isbntext;
BEGIN
‐‐ Если в таблице customers существуеткод, совпадающий с кодом
‐‐
покупателя в таблице new, присвоитьегопеременнойid_number.
SELECT INTO id_number id FROM customers WHERE id =
NEW.customer_id;
‐‐Еслисовпадениененайдено,инициироватьисключение.
IFNOTFOUNDTHEN
RAISEEXCEPTION"InvalidcustomerIDnumber.";
ENDIF;
‐‐ Если в таблице editions существует код ISBN, совпадающий
‐‐
с кодом ISBN в таблице new, присвоить его переменной book_isbn.
SELECTINTObook_isbnisbnFROMeditionsWHEREisbn=NEW.isbn;
‐‐Еслисовпадениененайдено,инициироватьисключение.
IFNOTFOUNDTHEN
RAISEEXCEPTION"InvalidISBN.";
ENDIF;
‐‐Еслиобепредыдущиепроверкизавершилисьуспешно,
‐‐обновитьколичествоэкземпляров.
IFTG_OP="INSERT"THEN
UPDATEstockSETstock=stock‐1WHEREisbn=NEW.isbn;
ENDIF;
RETURNNEW;
END;
'LANGUAGE'plpgsql';