2015-07-25 3 views
0

У меня есть требование, при котором статус столбца изменяется с x на y. Я хочу, чтобы захватить какой процесс изменил значение от й к у в таблице журнала и возбудит исключение для отката обновления с помощью Oracle ПЕРЕД UPDATE триггераCapture log information and raise exception в Oracle Trigger

Возможно ли это с помощью ргадта AUTONOMOUS_TRANSACTION?

Пожалуйста, помогите.

ответ

1

Возможно. Я предполагаю, что вы знаете, как идентифицировать «процесс, который изменил значение», который, как я предполагаю, исходит из некоторого столбца в v$session или в пользовательском контексте или в каком-то подобном источнике.

Вы бы обычно определить процедуру

CREATE OR REPLACE PROCEDURE log_error(<<parameters>>) 
AS 
    PRAGMA autonomous_transaction; 
BEGIN 
    insert into log_table ... 

    commit; 
END; 

, а затем вызвать эту процедуру из триггера, который выбрасывает исключение

CREATE OR REPLACE TRIGGER trg_no_x_to_y 
    BEFORE UPDATE ON table_name 
    FOR EACH ROW 
BEGIN 
    IF(:old.column = x and :new.column = y) 
    THEN 
    log_error; 
    raise_application_error(-20001, 'Cannot change column from x to y'); 
    END IF; 
END;