Oracle 中的触发器可以将数据保存到日志 table 并引发异常吗?

Can a trigger in Oracle saves data to log table and raises an exception as well?

伙计们:

我想知道是否有一种方法可以在 Oracle 中编写触发器来完成这两件事:将数据保存到日志 table 并引发用户定义的异常?

我正在尝试找出我团队数据库中的一个奇怪错误,该错误会导致每个业务逻辑的数据不一致。多个团队的应用程序可以访问该数据库。所以我写了一个触发器来监视导致问题的 table 中的某些列。如果值不正确,我想将用户 ID、节省时间等数据保存到日志 table,但我也想引发异常以引起注意。但是,每当我的触发器引发用户定义的异常时,将数据保存到日志 table 都没有完成。任何人都可以对此提出建议吗?提前谢谢你。

您可以编写一个使用自治事务的日志记录函数

create or replace procedure log_autonomous( p_log_message in varchar2,
                                            p_other_parameters... )
as
  pragma autonomous_transaction;
begin
  insert into log_table ...

  commit;
end;

然后从触发器中调用该日志记录函数

create or replace trigger my_trigger
  before insert or update on some_table
  for each row
declare
begin
  if( some_bad_thing )
  then
    log_autonomous( 'Some message', ... );
    raise_application_error( -20001, 'Some error' );
  end if;
end;

log_table 消息将被保留,因为它被插入到一个单独的(自治的)事务中。触发事务将回滚,因为触发器引发异常。