SQL Server嵌套触发器未按预期触发

时间:2014-02-21 11:30:51

标签: sql-server triggers powerbuilder

我已将SQL Server 6.5数据库升级到SQL Server 2012,方法是从6.5编写模式脚本,修复此脚本中的任何语法问题,然后我使用此脚本创建2012数据库。

同时我将前端应用程序从PowerBuilder 6升级到12.5。

当我在应用程序中执行某个操作时,它会将数据插入到给定的表中。此表具有与INSERT操作关联的触发器,并且在此触发器内更新其他表。这会导致在这些表上触发其他触发器。

最初,PowerBuilder应用程序报告以下错误:

在检索和更新之间更改了行。

没有对数据库进行任何更改。

现在我明白了这个错误信息意味着什么,但这就是它真正“有趣”的地方!

为了理解触发器中发生的事情,我决定从触发器内部将数据插入到日志记录表中,以便我可以更好地理解事件流。这有一个相当意想不到的副作用 - PowerBuilder应用程序不再报告任何错误,当我签入数据库时​​,所有数据都按预期写回。

如果删除这些日志记录行,应用程序将再次失败,并显示先前列出的错误消息。

我的问题是 - 有人可以解释为什么添加一些日志记录可能会产生这种副作用吗?这似乎是添加一些将数据写入日志记录表的日志记录,减慢速度或以某种方式序列化触发器以按正确的顺序触发的行为....

提前感谢您提供的任何见解:-)

1 个答案:

答案 0 :(得分:0)

好吧,让我们回顾一下这个消息出现的原因(我在http://www.techno-kitten.com/PowerBuilder_Help/Troubleshooting/Database_Irregularities/database_irregularities.html有更长的解释)。这基本上是因为数据库无法再根据DataWindow生成的WHERE子句找到它尝试更新的数据。触发器通过更改更新表中的列中的数据来实现此目的,因此WHERE =的逻辑失败。

如果我对此进行故障排除,我会针对两个版本的触发器执行以下操作:

  • 在应用程序中检索数据,也在DBMS工具中,从两者中缓存数据(来自PB中的原始缓冲区的数据,PB中的调试器断点可能有帮助)并比较您希望在WHERE子句中的列(客户端操纵数据和状态标志也会导致此问题)
  • 进行数据更改并启动保存
  • 来自SQLPreview事件中的断点(如果它是触发器引起的,这可能是多行),缓存挂起的UPDATE语句
  • 在SQLPreview中仍然暂停时,使用UPDATE语句中的WHERE子句使用DBMS工具选择数据

通过所有这些,您将确定在失败案例中进程崩溃的位置,并找出它在好的情况下传递的原因。我怀疑你会发现一个比你假设更简单的解决方案。

祝你好运,

特里