使用 NOT FOR REPLICATION 来控制约束、标识和触发器
在某些情况下,最好将复制拓扑中的用户活动与代理活动区别对待。 例如,如果用户在订阅服务器上插入行且该插入满足表的检查约束,则复制代理在订阅服务器上插入该行时,可能不需要实施相同的约束。 通过 NOT FOR REPLICATION 选项可以指定在复制代理执行操作时,区别对待下列数据库对象:
外键约束
在复制代理执行插入、更新或删除操作时,不实施外键约束。
检查约束
在复制代理执行插入、更新或删除操作时,不实施检查约束。
标识列
在复制代理执行插入操作时,标识列的值不递增。
触发器
在复制代理执行插入、更新或删除操作时,不执行触发器。
在发布表时,架构选项用于控制在订阅数据库中创建对象的方式。 默认架构选项因发布而异。 当将这些选项设置为在订阅数据库中创建外键约束和检查约束时,将设置 NOT FOR REPLICATION 选项。复制支持可更新订阅的合并发布和事务发布中的标识列时,也设置 NOT FOR REPLICATION 选项。 有关复制标识列的详细信息,请参阅复制标识列。
大多数情况下,默认设置都适用,但如果应用程序需要不同的行为,可以更改这些默认设置。 考虑的主要方面是触发器。 例如,如果定义一个插入触发器时设置了 NOT FOR REPLICATION 选项,则所有用户的插入操作都会触发该触发器,但复制代理的插入操作不会触发该触发器。 例如有一个将数据插入到跟踪表中的触发器: 当用户初始插入行时,将触发该触发器并在跟踪表中写入行,但在将数据复制到订阅服务器时,不应触发该触发器,因为这会导致在跟踪表中插入不必要的行。
指定 NOT FOR REPLICATION 选项
可以通过下列方式指定 NOT FOR REPLICATION 选项:
使用复制架构选项。 有关详细信息,请参阅如何指定架构选项 (SQL Server Management Studio) 和如何指定架构选项(复制 Transact-SQL 编程)。
在下列情况下,直接在 Transact-SQL 语法或在 Microsoft SQL Server Management Studio 中指定:
在发布数据库中创建或修改对象。
在订阅数据库中创建或修改对象。 通常只是在不使用快照的情况下初始化订阅时,才手动创建对象(而不是由复制创建)。
有关详细信息,请参阅: