我有一个要求,即列的状态从x变为y。 我想捕获哪个进程在日志表中将值从x更改为y 并引发异常以使用Oracle BEFORE UPDATE触发器回滚更新
这是否可以使用pragma autonomous_transaction?
请帮忙。
答案 0 :(得分: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;