當 IDENTITY_INSERT 設置為 OFF 時,不能為表‘XXX’中的標識列插入顯式值。


  在創建事務復制時,很多時候不一定使用默認的快照進行初始化,而是使用備份還原初始化。而當對有標識列(即identity的自增列)的表進行復制的時候,使用備份還原初始化搭建起來的復制常常就會報錯,即:當 IDENTITY_INSERT 設置為 OFF 時,不能為表‘XXX’中的標識列插入顯式值

  這個錯誤是在創建表的時候,有一項’標識規范‘中的’不用於復制‘默認為‘否’,所以在發布端數據庫插入數據時就會導致,右鍵表,選擇設計選項可以看到,如圖

  當使用備份還原進行初始化,訂閱端的這張表該選項也會默認為‘否’,因此就會報錯。在不刪除此復制的情況下,以下有幾種方法可進行修改:

1.  最簡單的就是把訂閱服務器上這張表的該選項修改為‘’即可;

2.  既然這里這個選項是‘否’,那么在創建這個表的時候在標識列就可以加一句:not for replication,但是既然已經有該表並且為了此表配置了復制,那么就可以在訂閱服務器上執行下面這句代碼即可,

use [database]
go
alter
table [tablename] alter column [columnname] add not for replication

3.  第三種方法需要對復制的原理有一定的了解,復制只會將配置了復制的表上的update,delete和insert操作所造成的數據變化傳遞過來,在訂閱服務器上針對這張表會創建三個存儲過程,分別為dbo.sp_MSupd_dbo表名、dbo.sp_MSdel_dbo表名、dbo.sp_MSins_dbo表名,用這三個存儲過程對訂閱表進行修改。那么因為identity的存在,identity_insert選項為OFF,而每一次的插入需要將identity_insert設置為ON才可以進行插入,所以我們可以直接將插入的這個存儲過程(dbo.sp_MSins_dbo表名)進行修改,加上下面這句,就可以自動插入數據。

set identity_insert [表名] on

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM