SQL Server的事务复制时有个问题让人困扰,就是在发布端的一个语句,如果涉及n条记录,则在订阅端会执行n次。
比如 delete T1 where id between 1 and 50
如果发布端有50条记录,则订阅服务器会自动将这个语句翻译成delete相关的存储过程,执行50次!!
其实SQL Server针对这种情况给了一种解决方案,就是复制存储过程的执行。
首先将要执行的语句封装在存储过程里,然后配置发布项时,将存储过程一起发布
注意:在创建的时候作如下操作:
发布存储过程的执行
-
在新建发布向导的“项目”页或“发布属性 - <发布>”对话框中,选择一个存储过程。
-
单击“项目属性”,然后单击“设置突出显示的存储过程项目的属性”。
-
在“项目属性 - <项目>”对话框中,为“复制”选项指定下列值之一:
- 存储过程的执行
- SP 的序列化事务中的执行
建议选择此选项,因为此选项仅当过程在可序列化事务的上下文中执行时才复制过程的执行。 如果存储过程在可序列化事务的外部执行,则已发布表中的数据更改将复制为一系列数据操作语言 (DML) 语句。
-
单击“确定”。
-
如果在“发布属性 - <发布>”对话框中,请单击“确定”保存并关闭对话框。
-
这里很多人都会被“SP的序列化事务的执行”所蒙蔽,想当然的以为这个可以实现穿透,将存储过程的执行动作复制过去,实际上不是这样的。
笔者作了多方尝试,对所谓的序列化测试发现,这个选项不起作用,使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE也未生效,不知道到底这个选项是何含义。不过,这并不违背笔者的本意:测试怎样让存储过程执行复制到订阅端去。
真正的答案是“存储过程的执行”,如下图所示:
最后提醒各位注意,在测试的过程中,如果变更了存储过程的定义,请启动复制,并且验证修改后的存储过程是否真正的发布到了订阅端,否则就会象笔者一样,尝试了n次才发现,原来订阅端的存储过程还是最初传过去的那个 ~
晕