我已将SQL Server 6.5数据库升级到SQL Server 2012,方法是从6.5编写模式脚本,修复此脚本中的任何语法问题,然后我使用此脚本创建2012数据库。
同时我将前端应用程序从PowerBuilder 6升级到12.5。
当我在应用程序中执行某个操作时,它会将数据插入到给定的表中。此表具有与INSERT操作关联的触发器,并且在此触发器内更新其他表。这会导致在这些表上触发其他触发器。
最初,PowerBuilder应用程序报告以下错误:
在检索和更新之间更改了行。
没有对数据库进行任何更改。
现在我明白了这个错误信息意味着什么,但这就是它真正“有趣”的地方!
为了理解触发器中发生的事情,我决定从触发器内部将数据插入到日志记录表中,以便我可以更好地理解事件流。这有一个相当意想不到的副作用 - PowerBuilder应用程序不再报告任何错误,当我签入数据库时,所有数据都按预期写回。
如果删除这些日志记录行,应用程序将再次失败,并显示先前列出的错误消息。
我的问题是 - 有人可以解释为什么添加一些日志记录可能会产生这种副作用吗?这似乎是添加一些将数据写入日志记录表的日志记录,减慢速度或以某种方式序列化触发器以按正确的顺序触发的行为....
提前感谢您提供的任何见解:-)
答案 0 :(得分:0)
好吧,让我们回顾一下这个消息出现的原因(我在http://www.techno-kitten.com/PowerBuilder_Help/Troubleshooting/Database_Irregularities/database_irregularities.html有更长的解释)。这基本上是因为数据库无法再根据DataWindow生成的WHERE子句找到它尝试更新的数据。触发器通过更改更新表中的列中的数据来实现此目的,因此WHERE =的逻辑失败。
如果我对此进行故障排除,我会针对两个版本的触发器执行以下操作:
通过所有这些,您将确定在失败案例中进程崩溃的位置,并找出它在好的情况下传递的原因。我怀疑你会发现一个比你假设更简单的解决方案。
祝你好运,特里