#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, хотя есть различия с «обычными» триггерами, поэтому пользователям следует ознакомиться с документацией, чтобы знать об этих различиях.