【问题标题】:ensure row inserted if trigger failed如果触发器失败,确保插入行
【发布时间】:2016-05-15 22:35:24
【问题描述】:

我在插入前有 oracle 11G 触发器,这并不重要;不需要其中的操作。另一方面,调用触发器的行正确插入到表中是非常重要的

我想知道是否有办法确保即使触发器失败,该行也会插入到表中?

我无法将触发器配置为后插入,因为它在插入之前以级联方式链接到另一个必须首先触发的触发器

提前感谢您的帮助

【问题讨论】:

  • 你的意思是,“如果触发器引发错误”?
  • 在触发器中捕获异常,不再引发。

标签: oracle triggers


【解决方案1】:

三种通用方法。

1) 如果您不关心触发器执行的操作是否成功,那么您一开始就不需要触发器。如果触发器永远不会运行会是一个问题,那么你确实关心触发器是否成功,你应该注意它的编码是否正确,如果偶尔出现问题,你应该接受。

2) 让触发器引发一个异步操作,该操作可以独立于触发操作成功或失败。这可能意味着您的触发器使用在触发事务提交后运行的dbms_job 提交作业,这可能意味着触发器将一行写入单独的表/ AQ,单独的进程从中读取并执行某些操作。当异步进程失败时,可以在触发进程仍在运行时单独调试。

3) 向触发器添加一个when others 异常处理程序,该处理程序执行一些有用的操作来记录异常并提醒人们存在错误而不会失败。不幸的是,这种方法经常会在没有人读取的表中写入一行,因此没有人知道操作失败了。如果没有人知道操作失败,也没有人知道它需要修复,并且您基本上回到了您在选项 1 中的状态,您确实应该删除代码。

【讨论】:

  • 你好贾斯汀你的回答比我预期的要多我选择了第三个选项登录表即使这个触发器并不重要(更准确地说,需要插入调用触发器的行),如果触发成功,使用此数据库的第三个应用程序必须发送邮件并在监控屏幕上显示一些信息。如果没有,最终用户会知道,他们会联系我非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多