首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:禁用触发器是否算作架构更改?(“无法完成游标操作,因为表架构更改了”)

问SQL:禁用触发器是否算作架构更改?(“无法完成游标操作,因为表架构更改了”)
EN

Stack Overflow用户
提问于 2010-01-01 07:10:34
回答 4查看 3K关注 0票数 3

禁用触发器是否算作Server中的架构更改?我正在收到错误:“由于表模式更改,无法完成游标操作”。

我有一个存储过程p_DeleteA,它从表A中删除一行,从表B中删除它的所有子记录;但是,随着表B中的一行被删除,表C、D和E中的孙子记录也会被删除。上面的实现方法是在表B周围游标,其中AId = xyz,然后调用p_DeleteB,后者删除C、D和E记录,然后B。

在开发数据库中,该过程工作正常。但是,在构建环境中,会发生上述错误。我能想象到的唯一可以算作“模式更改”的是,触发器被禁用以避免在表B上互相转移。禁用触发器是否意味着模式更改?如果不是,假设我没有在中间更改模式,什么会导致错误消息。“自动收缩”(我已读到会导致此错误)被关闭。

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

开发环境版本: 9.00.4035.00

构建环境版本: 9.00.1399.00

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-01 21:50:02

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-01 07:25:05

考虑到我碰到了KB930775: FIX:当您试图从使用Server 2005中的选项(重新编译)查询提示的游标中检索行时,“无法完成游标操作,因为表模式在声明游标后发生了更改或其他已知的问题,我更新到SP3,但没有解决问题。

将游标声明为本地和静态游标似乎已经做到了这一点:

代码语言:javascript
复制
DECLARE BCursor CURSOR LOCAL STATIC
FOR
    SELECT BId
    FROM B
    WHERE AId = @AId

见声明游标(Transact-SQL)。

静态 定义一个游标,该游标生成要由游标使用的数据的临时副本。对游标的所有请求都是从tempdb中的这个临时表中回答的;因此,对基表所做的修改不会反映在对该游标进行的获取返回的数据中,并且该游标不允许修改。

票数 4
EN

Stack Overflow用户

发布于 2010-01-01 21:52:54

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1988088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档