2016-10-18 4 views
0

enter image description hereТриггеры PL/SQL в Oracle

У меня есть следующие таблицы, показанные на картинке. Мне нужно создать триггер, который вставляет данные в таблицу AUDIT из таблицы PAYMENT, включая информацию о платеже, например: кто сделал платеж (pay_from), пользователь Oracle, который обработал платеж, идентификатор назначения (apt_id) и пациента, внесшего платеж (patient_id).

Из рисунка выше таблица ОПЛАТЫ имеет отношение к таблице НАЗНАЧЕНИЯ, которая, в свою очередь, имеет отношение к таблице ПАЦИЕНТ.

Мой вопрос: как я могу добавить «patient_id» из таблицы APPOINTMENT в таблицу AUDIT с помощью триггера? Это мой код:

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; 
+0

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

ответ

1

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

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

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

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

Смежные вопросы