Лабораторная работа 7
Перегружаемые функции, триггеры в PostgreSQL
Выполнил: Малко А.А.
Цель работы:
Изучение перегружаемых функций и триггеров в PostgreSQL. Изучить синтаксис команд. Получение навыков работы с триггерами.
Вариант 2:
Триггер выполняется перед удалением записи из таблицы клиента продуктового магазина. Триггер проверяет наличие в другой таблице записей, относящихся к удаляемому клиенту, и, если такие записи есть, удаляет их.
Триггер выполняется перед вставкой новой записи в таблицу клиентов продуктового магазина. Триггер проверяет значения, которые должна содержать новая запись и может их изменить:
Ход работы:
Исходное состояние таблицы sold_out.
Исходное состояние таблицы buyers.
Создадим триггерную функцию, удаляющую связи из таблицы sold_out при удалении строки из buyers, то есть при удалении чека, удаляются все записи о продаже по этому чеку из таблицы sold_out:
CREATE or REPLACE Function delete_buyer()
RETURNS trigger AS
$$
BEGIN
delete from sold_out where buyer=OLD.buyer_id;
RETURN OLD;
END
$$
LANGUAGE 'plpgsql';
Активируем триггер:
CREATE TRIGGER trig1
BEFORE DELETE ON buyers FOR EACH ROW
EXECUTE PROCEDURE delete_buyer();
Удаляем запись из таблицы buyers.
delete from buyers where buyer_id=4;
Видим, что связанные с данным чеком покупки так же были удалены:
Создадим триггерную функцию для вставки в таблицу gds согласно варианту (немного изменив условия задания):
CREATE SEQUENCE uid START WITH 100;
\\ Создание последовательности.
CREATE or REPLACE Function add_good()
RETURNS trigger AS
$$
BEGIN
IF (NEW.gds_name is null) then
NEW.gds.name='Tovar' || nextval('uid');
END IF;
IF (NEW.maker_name is null) then
NEW.maker_name = 'Moskva';
END IF;
IF (NEW.count_whs <= 0) then
IF (NEW.maker_name ='Moskva') then
NEW.count_whs=5;
ELSE
NEW.count_whs=0;
END IF;
END IF;
RETURN NEW;
END
$$
LANGUAGE 'plpgsql';
Активируем триггер на вставку в таблицу gds:
CREATE TRIGGER gds_trigger BEFORE INSERT ON gds
FOR EACH ROW EXECUTE PROCEDURE add_good();
Перегрузим функцию для вставки в таблицу gds, для проверки работы триггера:
CREATE or REPLACE function add_good(integer,integer,integer,integer,boolean)
returns void as
$$
BEGIN
insert into gds(shop_id,gds_name,gds_price,count_whs,count_sold_out, maker_name,arhiv)
values($1,null,$2,$3,$4,null,$5);
END
$$
LANGUAGE 'plpgsql';
Вызываем функцию вставки в gds:
select add_good(2,100,-5,200,FALSE);
Видим, что триггер сработал корректно:
Вывод
В результате выполнения данной работы были получены навыки создания триггеров определенных событий с детальной настройкой условия срабатывания триггера, а также привязывания функций-обработчиков событий к объекту триггера. Помимо этого, была продемонстрирована работа перегруженных функций.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.