1

我有一个使用 Adodb 在 Oracle 表(客户数据库)中插入数据的应用程序。

  1. 如果没有错误,则数据插入成功。
  2. 如果有任何错误,如无效数据类型等。错误由我的应用程序引发并捕获并转储到日志文件中。
  3. 我的客户在这个特定的表上编写了他们自己的触发器。插入记录时,在插入数据之前会进行一些其他检查

现在一切都很好,直到现在。

但是最近我们发现很多时候数据没有插入到oracle表中。

  1. 签入日志文件时未发现错误。
  2. 然后我记录了执行的查询。
  3. 将查询复制到 oracle Sql 提示符并执行它给出了触发器错误。

我的问题是

  1. 客户尚未准备好分享触发器的详细信息。
  2. 插入到 oracle 表时不会引发错误,因此我们无法记录它或采取任何行动。
  3. 在 oracle 中直接执行相同的 qry 时会显示触发错误。

需要帮助

  1. 为什么 ADODB 中没有引发错误
  2. 我是否必须通知客户实施任何错误引发
  3. 您可以为解决问题提出的任何建议

我对 Oracle 有 0% 到 10% 的知识

4

3 回答 3

1
  1. 您可以在日志表中记录您的业务逻辑。
  2. 但是您必须使用存储过程来记录消息。
  3. 存储过程应该有 pragma Transaction 以便您的日志数据必须保存在日志表中。
  4. 您是触发器应该有错误处理 - 在错误处理中,您必须调用 Logged 存储过程(具有编译指示事务)
于 2012-07-11T09:49:15.410 回答
1

“将查询复制到 oracle Sql 提示符并执行它给出了触发错误。” 由于 ADO 会话不报告错误,因此可能是来自触发器的错误具有误导性。它可能只是对“嘿,除非通过应用程序,否则不允许您插入此表”行进行检查。

“插入到 oracle 表时不会引发错误,因此我们无法记录它或采取任何行动。” 如果在插入时未引发错误,则可能在提交时引发错误。延迟约束和物化视图可以做到这一点。

假设地,我可以按如下方式重现您的经验: 1. 创建一个表 tab_a 具有最初延迟的可延迟约束(例如 val_a > 10) 2. ADO 会话插入违反约束的行但它不会出错,因为约束被延迟3. 提交发生并且约束违反异常触发并且事务被回滚而不是被提交。

所以看看你是否在考虑提交错误的可能性。

也可能是事务后期的其他事情导致整个事务回滚(例如死锁)。会话跟踪会很好。如果失败,请查看用户的 SERVERERROR 触发器以记录错误(例如在文件中,因此不会回滚)

http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2153530

于 2009-05-12T23:02:40.927 回答
0

我从未使用过 adodb (我假设这是您使用的,而不是 ADO.NET?).. 但是,快速查看它的引用会导致这个问题.. 您实际上是在检查查询的返回状态吗?

$ok = $DB->Execute("update atable set aval = 0");
if (!$ok) mylogerr($DB->ErrorMsg());
于 2009-05-12T12:29:16.620 回答