[配置选项] NOT FOR REPLICATION

SQL复制配置:NOT FOR REPLICATION详解
NOT FOR REPLICATION选项用于在复制过程中使约束、触发器等对复制的输入失效,防止在事务复制中出现问题。例如,它阻止触发器在复制事件中执行,允许自增列的Identity插入,并对来自复制的输入豁免检查约束。设置方法涉及触发器、自增列、外键约束和检查约束的修改或重建。
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里选择和表一起复制这些对象。


    
    































评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值