2014-02-21 47 views
0

我通过脚本化6.5中的模式将SQL Server 6.5数据库升级到SQL Server 2012,修复了此脚本中的任何语法问题,然后使用此脚本创建了2012年数据库。SQL Server嵌套触发器未按预期触发

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

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

最初的PowerBuilder应用程序报告以下错误:检索和更新之间

行改变。

对数据库没有更改。

现在我明白这个错误信息是什么意思,但这是它真正'有趣'的地方!

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

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

我的问题是 - 任何人都可以解释为什么添加一些日志记录可能有这种副作用?它几乎看起来像添加一些日志记录,将数据写入日志记录表,减慢速度或以某种方式序列化触发器以正确的顺序触发的动作....

在此先感谢您提供的任何洞察:-)

回答

0

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

如果我解决此,我会做的触发器的两个版本如下:

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

某处,你会查明过程在失败案例中已经崩溃了,并且弄清楚为什么它通过了这个好例子。我怀疑你会找到比你想象的更简单的解决方案。

祝你好运,

特里

+0

的提示特里非常感谢。 – user3336885

+0

非常感谢Terry的提示。事实证明,与PowerBuilder 12.5处理行计数有关的问题返回。由于与INSERT关联的一系列级联触发器会返回许多不同的行数。这些在PB 6.5中过滤出来,但在12.5中没有。设置RecheckRows DBParm解决了这个问题。 – user3336885