Триггеры PL/SQL: полное руководство по типам и примерам триггеров

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

  1. Триггеры на уровне строки.
    Триггеры на уровне строки срабатывают один раз для каждой затронутой строки при возникновении триггерного события. Они обычно используются для обеспечения соблюдения правил целостности данных или выполнения вычислений над конкретными данными строк. Ниже приведен пример триггера уровня строки, который предотвращает удаление строк из таблицы:
CREATE OR REPLACE TRIGGER prevent_deletion
BEFORE DELETE ON your_table
FOR EACH ROW
BEGIN
  RAISE_APPLICATION_ERROR(-20001, 'Deletion is not allowed.');
END;
/
  1. Триггеры на уровне оператора.
    Триггеры на уровне оператора срабатывают один раз для каждого триггерного события, независимо от количества затрагиваемых строк. Они полезны, когда вам нужно выполнить действие один раз для каждого оператора SQL. Вот пример триггера уровня инструкции, который регистрирует выполнение инструкции обновления:
CREATE OR REPLACE TRIGGER log_updates
AFTER UPDATE ON your_table
BEGIN
  INSERT INTO log_table (action_type, action_date)
  VALUES ('UPDATE', SYSDATE);
END;
/
  1. Триггеры вместо:
    Триггеры вместо являются специфичными для представлений и выполняются вместо оператора DML в базовой базовой таблице. Они позволяют настраивать поведение представлений и выполнять действия, которые напрямую не поддерживаются по умолчанию. Рассмотрим следующий пример, где триггер вместо позволяет вставлять данные в представление:
CREATE OR REPLACE TRIGGER insert_into_view
INSTEAD OF INSERT ON your_view
FOR EACH ROW
BEGIN
  INSERT INTO your_table (column1, column2)
  VALUES (:NEW.column1, :NEW.column2);
END;
/
  1. Составные триггеры.
    Составные триггеры сочетают в себе функциональность триггера как на уровне строки, так и на уровне оператора. Они позволяют вам определить действия, которые необходимо выполнить до, во время и после триггерного события. Этот тип триггера полезен, когда вам нужно поддерживать состояние или выполнять сложные операции над несколькими строками. Вот пример составного триггера, который вычисляет сумму столбца при обновлении строк:
CREATE OR REPLACE TRIGGER calculate_sum
FOR UPDATE ON your_table
COMPOUND TRIGGER
  total_sum NUMBER := 0;
  BEFORE STATEMENT IS
  BEGIN
    total_sum := 0; -- Reset the sum before each statement
  END BEFORE STATEMENT;
  AFTER EACH ROW IS
  BEGIN
    total_sum := total_sum + :NEW.column1; -- Accumulate the sum
  END AFTER EACH ROW;
  AFTER STATEMENT IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Total Sum: ' || total_sum); -- Output the sum
  END AFTER STATEMENT;
END;
/

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