如何将数据更改的传播方法设置为事务项目(复制 Transact-SQL 编程)

默认情况下,复制会自动生成用于将更改传播到订阅服务器的存储过程。通过事务复制,您可以控制如何将更改从发布服务器传播到订阅服务器,而这种传播方法可以在创建和之后更改项目时使用复制存储过程以编程的方式进行设置。

注意注意

可以为作用于发布数据行的每一种 DML(数据操作语言)操作(插入、更新或删除)指定一种不同的传播方法。

有关详细信息,请参阅 指定如何传播事务性项目的更改

创建使用 Transact-SQL 命令传播数据更改的项目

  • 在发布服务器上,对发布数据库执行 sp_addarticle。为 @publication 指定项目所属的发布的名称,为 @article 指定项目的名称,为 @source_object 指定要发布的数据库对象,并为下列至少一个参数指定 SQL 值:

    • @ins_cmd - 控制 INSERT 命令的复制。

    • @upd_cmd - 控制 UPDATE 命令的复制。

    • @del_cmd - 控制 DELETE 命令的复制。

    注意注意

    为以上任意参数指定 SQL 值后,该类型的命令将作为相应的 Transact-SQL 命令复制到订阅服务器。

    有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

创建不传播数据更改的项目

  • 在发布服务器上,对发布数据库执行 sp_addarticle。为 @publication 指定项目所属的发布的名称,为 @article 指定项目的名称,为 @source_object 指定要发布的数据库对象,并为下列至少一个参数指定 NONE 值:

    • @ins_cmd - 控制 INSERT 命令的复制。

    • @upd_cmd - 控制 UPDATE 命令的复制。

    • @del_cmd - 控制 DELETE 命令的复制。

    注意注意

    将以上任意参数指定为 NONE 值后,该类型的命令将不会复制到订阅服务器。

    有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

通过用户修改的自定义存储过程创建项目

  1. 在发布服务器上,对发布数据库执行 sp_addarticle。为 @publication 指定项目所属的发布的名称,为 @article 指定项目的名称,为 @source_object 指定要发布的数据库对象,并为包含值 0x02(可自动生成自定义存储过程)的 @schema_option 位掩码以及下列至少一个参数指定值:

    • @ins_cmd - 指定 CALL sp_MSins_article_name 值,其中 article_name 是为 @article 指定的值。

    • @del_cmd - 指定 CALL sp_MSdel_article_nameXCALL sp_MSdel_article_name 值,其中 article_name 是为 @article 指定的值。

    • @upd_cmd - 指定 SCALL sp_MSupd_article_nameCALL sp_MSupd_article_nameXCALL sp_MSupd_article_nameMCALL sp_MSupd_article_name 值,其中 article_name 是为 @article 指定的值。

    注意注意

    对于以上每个命令参数,您都可以为复制生成的存储过程指定您自己的名称。

    注意注意

    有关 CALL、SCALL、XCALL 和 MCALL 语法的详细信息,请参阅指定如何传播事务性项目的更改

    有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  2. 快照生成后,定位到此项目所属的发布的快照文件夹,并找到与此项目同名的 .sch 文件。使用 Notepad.exe 打开此文件,找到用于插入、更新或删除存储过程的 CREATE PROCEDURE 命令,并编辑过程定义以提供用于传播数据更改的任何自定义逻辑。有关详细信息,请参阅指定如何传播事务性项目的更改

    注意事项注意

    在编辑复制生成的任何快照文件时,都必须谨慎。必须测试和支持自定义存储过程中的自定义逻辑;Microsoft 不支持自定义逻辑。

用自定义存储过程中的自定义脚本创建项目以传播数据更改

  1. 在发布服务器上,对发布数据库执行 sp_addarticle。为 @publication 指定项目所属的发布的名称,为 @article 指定项目的名称,为 @source_object 指定要发布的数据库对象,并为包含值 0x02(可自动生成自定义存储过程)的 @schema_option 位掩码以及下列至少一个参数指定值:

    • @ins_cmd - 指定 CALL sp_MSins_article_name 值,其中 article_name 是为 @article 指定的值。

    • @del_cmd - 指定 CALL sp_MSdel_article_nameXCALL sp_MSdel_article_name 值,其中 article_name 是为 @article 指定的值。

    • @upd_cmd - 指定 SCALL sp_MSupd_article_nameCALL sp_MSupd_article_nameXCALL sp_MSupd_article_nameMCALL sp_MSupd_article_name 值,其中 article_name 是为 @article 指定的值。

    注意注意

    对于以上每个命令参数,您都可以为复制生成的存储过程指定您自己的名称。

    注意注意

    有关 CALL、SCALL、XCALL 和 MCALL 语法的详细信息,请参阅指定如何传播事务性项目的更改

    有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  2. 在发布服务器上,对发布数据库使用 ALTER PROCEDURE 语句来编辑 sp_scriptpublicationcustomprocs,以使该语句可以返回用于插入、更新和删除自定义存储过程的 CREATE PROCEDURE 脚本。有关详细信息,请参阅指定如何传播事务性项目的更改

    注意事项注意

    在编辑 sp_scriptpublicationcustomprocs 时,必须谨慎;必须测试和支持此存储过程中的自定义逻辑。Microsoft 不支持自定义逻辑或对系统存储过程的更改。

更改为现有项目传播更改的方法

  1. 在发布服务器上,对发布数据库执行 sp_changearticle。指定 @publication@article,为 @property 指定 ins_cmdupd_cmddel_cmd 值,并为 @value 指定适当的传播方法。

  2. 为每个要更改的传播方法重复步骤 1。