【发布时间】:2015-10-15 18:32:56
【问题描述】:
我有一个要求,列的状态从 x 变为 y。 我想捕获哪个进程将日志表中的值从 x 更改为 y 并引发异常以使用 Oracle BEFORE UPDATE 触发器回滚更新
这是否可以使用 pragma automatic_transaction ?
请帮忙。
【问题讨论】:
标签: sql oracle11g triggers datatrigger
我有一个要求,列的状态从 x 变为 y。 我想捕获哪个进程将日志表中的值从 x 更改为 y 并引发异常以使用 Oracle BEFORE UPDATE 触发器回滚更新
这是否可以使用 pragma automatic_transaction ?
请帮忙。
【问题讨论】:
标签: sql oracle11g triggers datatrigger
这是可能的。我假设您知道如何识别我猜想来自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;
【讨论】: