Триггеры PL / SQL в Oracle

#oracle #plsql #triggers

#Oracle #plsql #триггеры

Вопрос:

введите описание изображения здесь

У меня есть следующие таблицы, показанные на изображении. Мне нужно создать триггер, который вставляет данные в таблицу АУДИТА из таблицы ПЛАТЕЖЕЙ, включая информацию о платежах, например, кто произвел платеж (pay_from), пользователь Oracle, который обработал платеж, идентификатор назначения (apt_id) и пациент, который произвел платеж (patient_id).

Из приведенного выше изображения видно, что таблица ПЛАТЕЖЕЙ связана с таблицей НАЗНАЧЕНИЙ, которая, в свою очередь, связана с таблицей ПАЦИЕНТОВ.

Мой вопрос в том, как я могу добавить «patient_id» из таблицы НАЗНАЧЕНИЯ в мою таблицу АУДИТА с помощью триггера? Это мой код:

 CREATE OR REPLACE TRIGGER PAYMENT_AUDIT_TRIGGER 
AFTER INSERT ON PAYMENT 
FOR EACH ROW 
BEGIN
INSERT
INTO AUDIT_LOG VALUES
(
 AUDIT_LOG_AUDIT_ID_SEQ.NEXTVAL,
 :new.PATIENT_ID,
 :new.APT_ID,
 USER,
 SYSDATE,
 :new.PAY_FROM
);
END;
  

Комментарии:

1. Что плохого в простом запросе appointment таблицы? У вас есть apt_id . (кстати, я думаю, вам нужно потерять sql-server тег.)

Ответ №1:

В Oracle это легко, потому что у него есть триггеры before и after. Разница между ними, как легко догадаться, заключается в том, когда они выполняются — непосредственно перед операцией или после операции.

Триггер before полезен для перехвата входного потока для более сложного тестирования данных и / или изменения некоторых данных (например, для генерации значения ключа из последовательности в операциях вставки). Под «непосредственно перед» я подразумеваю, что сначала выполняется вся определенная проверка целостности — проверка типов, проверка ограничений, ссылочных ограничений и т. Д. Таким образом, вы можете знать, что данные уже прошли все эти проверки.

Триггер after полезен для регистрации только что выполненной операции. Если есть какое-либо условие ошибки, которое не позволяет завершить операцию, даже если она, возможно, прошла начальную проверку системы и дополнительную проверку, которая могла быть выполнена триггером before, триггер after не будет выполняться. Удобная особенность этого триггера заключается в том, что представленная ему строка будет именно той строкой, которая была вставлена / обновлена / удалена. Это означает, что любое сгенерированное значение ключа будет присутствовать для триггера after INSERT.

Это описание предназначено для Oracle и других систем, которые имеют оба типа триггеров. SQL Server имеет только триггер after, хотя недавно он расширил триггер instead of для работы с таблицами — по сути, превратив его в триггер before, хотя есть различия с «обычными» триггерами, поэтому пользователям следует ознакомиться с документацией, чтобы знать об этих различиях.