網站運營seo文章大全提供全面的站長運營經驗及seo技術!
這篇文章主要總結一下標識列在復制中的處理方法
1、快照復制
   在快照復制中,通常無須考慮標識列的屬性。
2、事務復制
   舉例:
   發布數據庫a,訂閱數據庫b,出版物為t_test_a,訂閱表為t_test_b
   create table t_test_a
 (id int identity(1,1),
  name varchar(50)
 )
   create table t_test_b
 (id int identity(1,1),
  name varchar(50)
 )
    
   在這種情況下,復制代理將無法將新行復制到庫b,因為列id是標識列,不能給標識列顯示提供值,復制失敗。
   這時,需要為標識列設置not for replication 選項。這樣,當復制代理程序用任何登錄連接到庫b上的表t_test時,該表上的所有 not
   for replication 選項將被激活,就可以顯式插入id列。
   這里分兩種情況:
   1、庫b的t_test表不會被用戶(或應用程序)更新
   最簡單的情況是:如果庫b的t_test不會被用戶(或應用程序)更新,那建議去掉id列的標識屬性,只采用簡單int類型即可。
   2、庫b的t_test表是會被其他用戶(或應用程序)更新
   這種情況下,兩個t_test表的id列就會發生沖突,舉例:
   在庫a中執行如下語句:
   insert t_test_a(name) values('tom')(假設id列為1)
   在庫b中執行如下語句:
   insert t_test_b(name) values('pip')(假設id列為1)
   這樣,就會在庫a和庫b的兩個表分別插入一條記錄,顯然,是兩條不同的記錄。
   然而事情還沒有結束,待到預先設定的復制時間,復制代理試圖把記錄"1 tom"插入到庫b中的t_test表,但庫b的t_test_b表已經存在
id為1的列,插入不會成功,通過復制監視器,我們會發現復制失敗了。
   解決以上問題的方法有:
  (1)為發布方和訂閱方的標識列指定不同范圍的值,如上例可修改為:
     --確保該表記錄不會超過10000000
     create table t_test_a
 (id int identity(1,1),
  name varchar(50)
 )
   create table t_test_b
 (id int identity(10000000,1),
  name varchar(50)
 )
   (2)使發布方和訂閱方的標識列的值不會重復, 如
     --使用奇數值
     create table t_test_a
 (id int identity(1,2),
  name varchar(50)
 )
     --使用偶數值
     create table t_test_b
 (id int identity(2,2),
  name varchar(50)
 )
    這種辦法可推廣,當訂閱方和發布方有四處時,標識列屬性的定義分別如下
    (1,4),(2,4),(3,4),(4,4)
3、合并復制
   采用事務復制中解決方法,只要使發布表和訂閱表標識列的值不重復既可。