Изучение триггеров PL/SQL: подробное руководство с примерами кода

Триггеры PL/SQL — это мощные объекты базы данных, которые позволяют разработчикам автоматизировать действия в ответ на определенные события, происходящие в базе данных Oracle. Триггеры можно использовать для обеспечения целостности данных, выполнения проверок, обновления связанных таблиц или запуска сложной бизнес-логики. В этой статье мы рассмотрим различные методы реализации триггеров PL/SQL, сопровождаемые примерами кода, демонстрирующими их использование.

  1. Синтаксис триггера PL/SQL:
    Триггер PL/SQL определяется с использованием следующего синтаксиса:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {event(s)}
ON table_name
[FOR EACH ROW]
[WHEN (condition)]
DECLARE
    -- Variables and declarations
BEGIN
    -- Trigger logic and actions
EXCEPTION
    -- Exception handling
END;
/
  1. Типы триггеров.
    Существует три основных типа триггеров в зависимости от времени их выполнения:

    • BEFORE Triggers: выполняется до того, как произойдет событие-триггер.
    • Триггеры AFTER: выполняются после возникновения триггерного события.
    • ВМЕСТО триггеров: выполняется вместо триггерного события.
  2. Создание простого триггера.
    Давайте создадим простой триггер, который автоматически обновляет столбец «last_modified» при каждом обновлении строки в таблице «сотрудники»:

CREATE OR REPLACE TRIGGER update_last_modified
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
   :NEW.last_modified := SYSDATE;
END;
/
  1. Составной триггер.
    Составной триггер – это особый тип триггера, который объединяет все точки времени (ДО, ПОСЛЕ и ВМЕСТО) в одно тело триггера. Это позволяет выполнять действия на разных стадиях триггерного события. Вот пример:
CREATE OR REPLACE TRIGGER compound_trigger_demo
FOR employees
COMPOUND TRIGGER
   -- Declaration section
   -- Variables, cursors, etc.
   BEFORE EACH ROW IS
   BEGIN
      -- Trigger logic before row operation
   END BEFORE EACH ROW;
   AFTER EACH ROW IS
   BEGIN
      -- Trigger logic after row operation
   END AFTER EACH ROW;
   AFTER STATEMENT IS
   BEGIN
      -- Trigger logic after statement execution
   END AFTER STATEMENT;
END compound_trigger_demo;
/
  1. Обеспечение целостности данных.
    Триггеры можно использовать для обеспечения соблюдения сложных бизнес-правил и ограничений целостности данных. Вот пример триггера, который ограничивает удаление отдела, если в нем есть активные сотрудники:
CREATE OR REPLACE TRIGGER prevent_dept_deletion
BEFORE DELETE ON departments
FOR EACH ROW
DECLARE
   emp_count NUMBER;
BEGIN
   SELECT COUNT(*) INTO emp_count
   FROM employees
   WHERE department_id = :OLD.department_id;

   IF emp_count > 0 THEN
      RAISE_APPLICATION_ERROR(-20001, 'Cannot delete department with active employees.');
   END IF;
END;
/

Триггеры PL/SQL — это универсальный инструмент для автоматизации действий в базе данных Oracle. Они предоставляют механизм реагирования на определенные события и выполнения пользовательской логики. В этой статье мы рассмотрели синтаксис, типы и примеры реализации триггеров PL/SQL. Используя возможности триггеров, разработчики могут повысить целостность данных, обеспечить соблюдение бизнес-правил и оптимизировать сложные операции с базами данных.