Перейти к основному содержимому
Модуль 12 · Урок 3 из 447/57 в курсе~15 min
Уроки модуля (3/4)

Введение в триггеры

Триггер — это волшебный ящик (датчик), который автоматически запускает часть логики ДО или ПОСЛЕ события вставки, обновления или удаления в данных.\nОднако, прежде чем научить таблицу реагировать, нам нужно дать ей специальную «Триггерную функцию», написанную на PL/pgSQL, которая должна завершиться возвратом синтетического формата под названием «TRIGGER».

Эти функции не принимают обычные аргументы в круглых скобках; вместо этого они бесплатно предлагают волшебные встроенные объекты NEW и OLD, которые содержат исходные или входящие данные строк из таблицы, за которой следит датчик!

SQL
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
  -- OLD.id is magically the id value of the poor record being deleted
  INSERT INTO audit_log (table_name, record_id, action)
  VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');

  RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;

Эта процедура выполняет тяжелую работу по записи в журнал. Позже, на втором этапе, он будет постоянно привязан к событиям таблицы, которую мы хотим защитить.

Попробуйте сами

Упражнение#sql.m12.l3.e1
Попыток: 0Загрузка…

Нам нужно защитить клиентов: никто младше 18 лет (наша виртуальная проверка) или, помимо вымышленной логики, мы хотим, чтобы строка «first_name», передаваемая во время INSERT, всегда сохранялась в базе данных в верхнем регистре, игнорируя любое форматирование клиента JS.\nНапишите триггерную функцию под названием «force_uppercase_name()». Он не принимает аргументов ().\nОн возвращает TRIGGER. Создайте шаблон тела.\nПринудительно назначьте весь входящий объект с помощью магического присваивания 'NEW.first_name = UPPER(NEW.first_name);'. Затем ВЕРНИТЕ измененную НОВУЮ переменную.

Загрузка редактора…
Показать подсказку

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮforce_uppercase_name() ВОЗВРАЩАЕТ ТРИГГЕР AS $$ BEGIN NEW.first_name = UPPER(NEW.first_name); ВОЗВРАТ НОВЫЙ; КОНЕЦ; $$ ЯЗЫК plpgsql;

Решение доступно после 3 попыток

Упражнение#sql.m12.l3.e2
Попыток: 0Загрузка…

Создайте триггерную функцию «protect_price_drops()», которая блокирует вредоносные обновления, когда злоумышленник собирается сэкономить на смехотворно низкой цене на продукт.\nИспользуйте логику типа «IF NEW.unit_price < OLD.unit_price THEN», вызывая собственное исключение, которое приводит к сбою всего.\nНеустрашимое исключение PL/pgSQL использует форму «RAISE EXCEPTION ''Prezzo not abbassabile!»'';'.

Загрузка редактора…
Показать подсказку

BEGIN IF NEW.unit_price < OLD.unit_price THEN ПОДНИМИТЕ ИСКЛЮЧЕНИЕ 'Prezzo non abbassabile!'; КОНЕЦ ЕСЛИ; ВОЗВРАТ НОВЫЙ; КОНЕЦ;

Решение доступно после 3 попыток