禁用触发器是否算作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
发布于 2010-01-01 21:50:02
是。触发器create/drop/alter是表上的架构更改,将触发重新编译并使动态游标失效。
发布于 2010-01-01 07:25:05
考虑到我碰到了KB930775: FIX:当您试图从使用Server 2005中的选项(重新编译)查询提示的游标中检索行时,“无法完成游标操作,因为表模式在声明游标后发生了更改或其他已知的问题,我更新到SP3,但没有解决问题。
将游标声明为本地和静态游标似乎已经做到了这一点:
DECLARE BCursor CURSOR LOCAL STATIC
FOR
SELECT BId
FROM B
WHERE AId = @AId静态 定义一个游标,该游标生成要由游标使用的数据的临时副本。对游标的所有请求都是从
tempdb中的这个临时表中回答的;因此,对基表所做的修改不会反映在对该游标进行的获取返回的数据中,并且该游标不允许修改。
发布于 2010-01-01 21:52:54
添加或删除触发器是架构更改。触发器是一个痛苦的世界,因为这些不确定的数据驱动的副作用的确切类型。始终避免触发器,因为它们使您的表dml非正交。
https://stackoverflow.com/questions/1988088
复制相似问题