【问题标题】:SQL: Does disabling triggers count as schema change? ("Could not complete cursor operation because the table schema changed")SQL:禁用触发器算作架构更改吗? (“无法完成游标操作,因为表架构已更改”)
【发布时间】:2010-01-01 07:10:34
【问题描述】:

禁用触发器是否算作 SQL Server 中的架构更改?我收到错误消息:“无法完成游标操作,因为表架构已更改”

我有一个存储过程 p_DeleteA,它从表 A 中删除一行,并从表 B 中删除它的所有子记录;但是,随着表 B 中的一行被删除,表 C、D 和 E 中的孙记录也被删除。以上是通过游标围绕AId = xyz的表B,然后调用p_DeleteB,删除C、D、E记录,然后是B。

在开发数据库中,该过程运行良好。但是在构建环境中会发生上述错误。我唯一可以认为是“架构更改”的事情是触发器被禁用以避免在表 B 上相互踩踏。禁用触发器算作架构更改吗?如果不是,假设我没有在中间更改架构,可能会导致错误消息。我读到的 Autoshrink 可能会导致此错误,已关闭。

编辑:我正在模拟级联删除,但我正在手动删除所有记录。

开发环境版本:9.00.4035.00
构建环境版本:9.00.1399.00

【问题讨论】:

    标签: sql-server sql-server-2005 tsql


    【解决方案1】:

    认为我遇到了KB930775: FIX: Error message when you try to retrieve rows from a cursor that uses the OPTION (RECOMPILE) query hint in SQL Server 2005: "Could not complete cursor operation because the table schema changed after the cursor was declared 或其他已知问题,我更新到 SP3,但没有解决问题。

    将光标声明为本地和静态似乎已经成功了:

    DECLARE BCursor CURSOR LOCAL STATIC
    FOR
        SELECT BId
        FROM B
        WHERE AId = @AId
    

    DECLARE CURSOR (Transact-SQL)

    静态
    定义一个游标,使 要使用的数据的临时副本 由光标。所有请求 光标由此得到回答 tempdb 中的临时表;所以, 对基表所做的修改是 没有反映在返回的数据中 获取对此游标进行的操作,并且此 光标不允许修改。

    【讨论】:

    • 是的,可能。摆脱你的光标,你会有一个更轻松的时间。如果你想发布你的代码,会有很多人可以帮助你。我的另一个答案仍然成立......最后一段我说“如果我是你......”
    • 我添加了静态,它有帮助!谢谢!
    【解决方案2】:

    是的。触发器 create/drop/alter 是对表的架构更改,将触发重新编译并使动态游标无效。

    【讨论】:

    • 我会接受这个作为答案,但另请参阅我的解决方法。
    【解决方案3】:

    添加或删除触发器是架构更改。由于这些确切类型的非确定性数据驱动的副作用,触发器是一个痛苦的世界。始终避免使用触发器,因为它们会使您的表格 dml 非正交。

    【讨论】:

      【解决方案4】:

      所以...您的光标期望记录存在于其他表中,但随后发现它们不存在。

      但我很困惑 - 您是否打开了级联删除功能,还是您自己删除了它们?您说的是调用 p_DeleteB 的游标,这听起来不像是级联删除。

      事实上,听起来你没有实现 FK,这也不好。

      如果我是你,我会考虑在没有游标的情况下执行此操作 - 这可能会很好地解决你的问题,因为没有游标,不应该存在对架构的依赖。

      【讨论】:

      • 很抱歉给您带来了困惑。我自己删除它们,到处都有FK。我用游标重用p_DeleteB,比较复杂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2017-09-15
      • 2013-08-23
      • 2012-01-10
      相关资源
      最近更新 更多