我需要从存储过程写入日志表。 现在这个日志信息必须在回滚场外生存。在当前事务之外提交事务(如Oracle中的自治事务)
我知道这个问题已被问过,但我的情况是不同的,我无法在这些问题中找到我的问题的答案。
当存储过程中没有错误时,事情很简单,日志表中的条目就在那里。
出现错误时比事情复杂。
在过程中,我可以在catch中回滚,然后将数据插入到日志表中,我知道这一点,而且我已经这样做了。
但问题是,当调用存储过程是这样的:
begin transaction
exec myStoredProcedure
rollback transaction
select * from myLogTable
我知道这个代码使没有太大意义,我一直是mimimal来证明我的问题。
如果存储过程的调用者执行了提交/回滚,那么它对我在存储过程中所做的并不重要。我的logentry将永远回滚。
我也不能使用临时表技巧,它是返回我想要记录的数据,并让调用者使用该数据在完成回滚之后将其插入到日志表中,因为调用者是外部应用程序我没有来源。
日志记录是在一个单独的过程中完成的,只有一行代码插入到日志表中。
我需要的是一种在当前事务之外的过程中提交插入的方式,因此它可以在任何回滚之后存活。
有没有办法做到这一点?
解决方案:
我用lad2025
答案,迄今为止,它是工作没有任何问题或性能问题。
但是这个过程每天只会被调用大约1000次,这并不是那么多,所以我想我也不需要任何问题。
这看起来很有趣。可以安装扩展包而不使DB脱机?它会影响性能吗?后者是很重要的,因为日志记录是很容易发生的事情 – GuidoG
@GuidoG安装非常简单,它执行一组脚本(最终将在主DB中包含许多存储过程/类型)。我不测试性能(我会建议在DEV/QA env上尝试它)并进行大量测试。 – lad2025
好的我会这么做,谢谢 – GuidoG