1)NOT FOR REPLICATION的作用
一个对象上有一些性质,比如约束、触发等,这些设置对一般用户输入和复制的输入都起作用。NOT FOR REPLICATION是使这些设置对来自复制的输入失效,如下图。以下介绍针对各个不同对象设置NOT FOR REPLICATION的作用。
a. 对于 【触发器,级联删除】 来讲
在事务复制中,复制传递过来的触发动作和原始动作导致的触发动作会一起执行,导致该动作被执行两次,会出现一些问题,比如插入失败、删除失败等。设置NOT FOR REPLICATION则是指,在保持对普通用户动作激活有效的情况下,对于事务复制过来的用户动作,触发机制失效。
触发动作包括:
触发器的内容
外键约束的级联更新\删除动作
b. 对于 【自增列】 来讲
首先,发布者在发布数据时,是连自增列一起发布的,故会对其他表做Identity插入。
那么,如果对表设置了 SET IDENTITY_INSERT OFF(不允许Identity插入),且不开启NOT FOR REPLICATION,就会限制Identity插入,无论是来着用户的插入,还是来自事务复制的插入。所以为了成功接受发布者的数据,要开启NOT FOR REPLICATION,即允许事务复制做的Identity插入。如果设置了SET
IDENTITY_INSERT ON,那么是否启用NOT FOR REPLICATION就没有什么区别了。
c. 对于【检查约束】来讲
如果不开启NOR FOR REPLICATION,check约束会限制来自用户的输入和事务复制的输入。如果开启了NOT FOR REPLICATION,则只不检查来自事务复制的输入。
2)对各对象设置NOT FOR REPLICATION的方法:
1 对于触发器,执行下面语句
2 对于identity,在SSMS浏览器里选取列,右击想改的列,点击MODIFY,出现下述页面。然后在最底下可以翻到NOT FOR REPLICATION选项。注意,修改该选项,只能先删掉表,再重新创建。
也可以删掉表后执行
3 对于外键约束,先删除原有外键约束,再重建外键约束并启用NOT FOR REPLICATION并添到表中,如下
4 对于检查约束,先删除原有检查约束,再重建检查约束并启用NOT FOR REPLICATION并添到表中,如下
最后补记一点:默认情形下,Trigger,外键约束,检查约束都不会被复制到订阅者,这些对象需要手动创建。但是也可以在Aarticle Properties里选择和表一起复制这些对象。
NOT FOR REPLICATION选项用于在复制过程中使约束、触发器等对复制的输入失效,防止在事务复制中出现问题。例如,它阻止触发器在复制事件中执行,允许自增列的Identity插入,并对来自复制的输入豁免检查约束。设置方法涉及触发器、自增列、外键约束和检查约束的修改或重建。
562

被折叠的 条评论
为什么被折叠?



