伙计们:
我想知道是否有一种方法可以在Oracle中编写触发器来同时完成这两件事:将数据保存到日志表中,并引发用户定义的异常?
我正试图找出团队数据库中的一个奇怪错误,该错误会导致每个业务逻辑的数据不一致。多个团队的应用程序可以访问此数据库。所以我写了一个触发器来监视表中导致问题的某一列。如果值不正确,我想将用户ID、保存时间等数据保存到日志表中,但我也想引发异常以引起注意。然而,每当我的触发器引发用户定义的异常时,将数据保存到日志表并没有完成。有人能对此提出建议吗?提前谢谢。
您可以编写一个使用自主事务的日志记录函数
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
消息将被保留,因为它被插入到一个单独的(自主的)事务中。由于触发器引发异常,触发事务将被回滚。