捕获日志信息并在Oracle Trigger中引发异常

时间:2015-07-25 00:04:46

标签: sql oracle11g triggers datatrigger

我有一个要求,即列的状态从x变为y。 我想捕获哪个进程在日志表中将值从x更改为y 并引发异常以使用Oracle BEFORE UPDATE触发器回滚更新

这是否可以使用pragma autonomous_transaction?

请帮忙。

1 个答案:

答案 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;