【问题标题】:SQL Server Nested Triggers not firing as expectedSQL Server 嵌套触发器未按预期触发
【发布时间】:2016-02-07 23:44:43
【问题描述】:

我已通过编写 6.5 架构的脚本将 SQL Server 6.5 数据库升级到 SQL Server 2012,修复了此脚本中的所有语法问题,然后我使用此脚本创建了 2012 数据库。

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

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

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

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

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

现在我明白这条错误消息的含义了,但这才是真正“有趣”的地方!

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

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

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

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

【问题讨论】:

    标签: sql-server triggers powerbuilder


    【解决方案1】:

    好吧,让我们回顾一下为什么会出现这条消息(我在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 工具选择数据

    通过所有这些,您将确定在失败情况下流程在哪里发生故障,并找出在良好情况下它通过的原因。我怀疑您会找到比您假设的更简单的解决方案。

    祝你好运,

    特里

    【讨论】:

    • 非常感谢特里的提示。事实证明,与 PowerBuilder 12.5 如何处理返回的行数有关的问题。由于有一系列与 INSERT 关联的级联触发器,因此会返回许多不同的行数。这些在 PB 6.5 中被过滤掉,但在 12.5 中没有。设置 RecheckRows DBParm 解决了这个问题。
    猜你喜欢
    • 2018-10-07
    • 2013-01-29
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多