INF: 託管的範圍標識,在合併複製

概要:

合併複製的挑戰之一和共享新插入的數據不同的數據庫之間的任何其他技術是增量的列的值經常使用的表作爲主關鍵字的"ID"列的處理。

例如對於如果兩個數據庫共享具有一個增量的 ID 列的表中的數據,並且這兩個表具有 ID 值爲從 到 100 下一個插入的每個數據庫中是 101。新行復制到其他數據庫時沒有用 101 的值的兩個行。因爲主鍵列都必須有唯一索引,將出現違反唯一約束。

同時與所有遞增的技術和複製有關的問題都是相同,本文重點介紹合併複製處理 IDENTITY 屬性 SQL Server 2000 中的方式。 

更多信息:

在合併複製中的標識列

在複製的標識值目標是爲使用遞增的一種技術,以便在不同的服務器上執行的插入將不會使用相同的增量值。合併複製都必須處理的已斷開連接並不能互相的服務器,因爲它無法協調每次插入來使用跨表的兩份副本的下一個可用的 ID 值。 

ranged 的標識

解決方案合併複製使用是"ranged 的身份",在其中每個已發佈的項目分配一個標識值的範圍。每個表中的標識值開始的區域,最小值和增量爲範圍的最大值。例如對於範圍內的工作分配可能會被定義爲 100 個批處理:

   Range      Range

Server             Minimum    Maximum

------------------ ---------- ---------- 

Publisher                 1      100

Subscriber1             101      200

Subscriber2             201      300

若要實現這些範圍,標識列,每個表中的種子屬性設置爲種子遞增的值,在該範圍的低端開始範圍的最小值。若要控制範圍的高端,CHECK 約束用於防止在標識列的值超出了範圍達不到。

例如對於 Publisher 表格可能被定義爲: 

CREATE TABLE id_table

(

     ID int identity (1,1) not for replication primary key,

     CONSTRAINT id_range_check CHECK (ID BETWEEN 1 AND 100)

)

的 Subscriber1 表就是: 

CREATE TABLE id_table

(

     ID int identity (101,1) not for replication primary key,

     CONSTRAINT id_range_check CHECK (ID BETWEEN 101 AND 200)

)

的 Subscriber2 表就是: 

CREATE TABLE id_table

(

     ID int identity (201,1) not for replication primary key,

     CONSTRAINT id_range_check CHECK (ID BETWEEN 201 AND 300)

)

分配新範圍

使用早在這篇文章中對錶定義每個訂閱服務器可以成功地插入 100 的行,並可以該新插入的數據被安全地複製到其它訂閱服務器 (或發佈服務器) 數據庫而不會出現任何錯誤或沒有唯一索引衝突。但是,百分之一一行之後插入開始,到失敗消息,以表明該訂閱服務器端的標識範圍已滿

服務器: 消息 548,級別 162,狀態行 1

通過 複製來管理的標識範圍已滿,必須由複製代理程序進行更新。INSERT 衝突發生在數據庫 dbGeneralMergeSub 表 t1c1 列中。Sp_adjustpublisheridentityrange 可以被調用以獲取新的標識範圍。 

該語句已終止。 

當原始的標識範圍填滿時,複製代理程序必須允許任何更多的行插入到表之前創建新的範圍。使用前面的示例中下一個可用區域是 301-400,下面的 TRANSACT-SQL 代碼用於實現新的區域:

ALTER TABLE id_table DROP CONSTRAINT id_range_check

DBCC CHECKIDENT('id_table','reseed',301)

ALTER TABLE WITH NOCHECK id_table ADD CONSTRAINT id_range_check

CHECK (ID BETWEEN 301 and 400)

 此點後插入允許在表中和他們開始新的區域中遞增。請注意此代碼僅用於說明。合併複製將爲您,管理這一過程,如果表已爲合併複製而發佈,則無法使用此技術。 

如何實現託管的範圍標識與合併複製

雖然可以實現一應俱全身份獨立於合併複製,尤其是如果服務器沒有可靠的網絡鏈接可能非常難以管理範圍分配和重新分配新的範圍。 

標識列和 NOT FOR REPLICATION

沒有要複製含標識列的表時需要記住的特殊考慮。默認狀態下,SQL Server 不知道誰正在執行插入。可能正在執行插入操作,用戶進程,或者它可能是複製用戶插入在合併複製過程。在這兩種情況下默認 SQL Server 試圖加載行時,增量標識列。但是,您通常希望 SQL Server 僅當用戶執行插入,但您不希望會增加時複製過程將新行插入到另一臺服務器在複製拓撲中的值時,才增加值。將行插入到另一臺服務器時您通常希望它保留從原始的插入值。

由於這個原因如果您要發佈包含帶有 IDENTITY 屬性列的表必須使用 NOT FOR REPLICATION NFR) 屬性爲標識列。此選項設置 SQL Server 識別這些合併複製進程,他們執行插入,並保留原始的標識列值時。

如果沒有使用 NFR 屬性,則您可能會在合併過程中收到幾種不同類型的錯誤。錯誤範圍爲唯一索引錯誤更細微的錯誤,如外鍵衝突和觸發器錯誤。

添加在 NOT FOR REPLICATION 選項到現有表

如果您要發佈具有標識列的現有表,您必須首先將 NOT FOR REPLICATION 屬性添加到標識列。這是相對簡單,如果表是空的。您只需刪除表,並使用 NOT FOR REPLICATION 選項重新創建它。但是,因爲 TRANSACT-SQL ALTER TABLE 語句不允許您更改標識列屬性,這可能會變得更加困難如果例如對於沒有必須保留數據,或者如果標識列也是表的主鍵,並且其他表具有引用主鍵的標識列的 FOREIGN KEY 約束。

下面是基本過程將在 NOT FOR REPLICATION 的屬性添加到現有的表: 1.備份數據庫。

2.將表格中的數據複製到另一個表或文件。

3.保存該引用標識表的外鍵約束的 SQL 腳本,然後刪除外鍵。您需要稍後重新創建外鍵這些腳本。

4.刪除標識的表,然後使用 NOT FOR REPLICATION 選項重新創建它。

5.設置爲 ON IDENTITY_INSERT 選項的表。

6.將數據從另一個表或文件複製到新表。

7.將 IDENTITY_INSERT 選項設置爲 OFF,爲表。

8.通過使用以前保存的腳本,重新創建外鍵。

如何配置合併複製項目

當創建的出版物基於帶有標識列的表的一篇文章 sp_addmergearticle 存儲過程提供了這些選項: 

@ auto_identity_range

所需要的值是 TRUE 和 FALSE。默認值爲 FALSE。如果設置爲 TRUE,合併複製管理標識範圍,則分配給表的每個訂閱服務器。

@ pub_identity_range

此值確定爲已發佈的數據庫中表定義的標識範圍的大小。如果已發佈的表已有數據,從列中最大的現有值將啓動新的區域。

@ identity_range

此值是爲每個訂閱服務器數據庫中表定義該區域的大小。

閾值

此值範圍從 到 100,並且定義了範圍,從而導致合併進程分配新範圍的百分比。示例如果範圍大小爲 100,從 到 100 和 閾值 是 80,合併代理程序將分配新範圍後插入值 80

注: 此相同的存儲的過程參數和身份管理功能都可用於 sp_addarticle 存儲過程中的事務複製項目。 

重新分配範圍的特殊注意事項

實現的標識範圍在發佈和分發數據庫進行管理和它們僅重新分配在合併複製處理過程中至關重要。通過在表上的 CHECK 約束控制託管的範圍。因此,如果該用戶執行填滿其表的範圍不足,無法插入,所有更高版本的插入失敗,出現錯誤 548 (如本文的"一應俱全標識"部分所述)。若要獲取新的範圍爲訂閱服務器表唯一的方法是運行合併代理程序。完整發行商的範圍時,可以不通過調用 sp_adjustpublisheridentityrange 存儲過程運行合併代理程序的情況下重新分配新的範圍。 

規劃身份管理選項

在實現 ranged 的身份管理與合併複製之前,必須先考慮將由用戶執行多少插入和頻率它們將被合併他們所做的更改。定義爲一篇文章標識選項時的主要目標是使足夠大,訂閱服務器上將不會運行在下一個合併前的值超出了範圍。

太小範圍是否用戶不能插入新行之後該區域已滿。但是,如果範圍大小來說太大,並且每個訂閱服務器只使用其範圍內的一小部分將有較大間隔中遞增的值。這可以是感覺問題的用戶習慣於嚴格地遞增的值。它可能會變得非常大分配的範圍使有這麼多它們是困難的用戶必須手動輸入的 ID 值在 Web 頁或其他用戶界面中的數字值。在極端的情況下,它有可能爲標識列的限制爲在數據類型大於分配的範圍。

如果是可接受的間隙,並且您具有少量的訂閱服務器可以進行範圍足夠大,以便訂閱服務器可能永遠也不需要新的範圍。或者您可以設置它,以便它們只需要一個新的區域,每個日、 周,或根據需求的應用程序的每月。

您還可以使用 閾值 定義之前舊區域已滿,合併代理程序主動程度分配新範圍的值。設置 閾值 得太低將導致它們滿之前多長時間正在進行重新分配在區域中這也導致遞增的值中的顯示更大的間隙。設置得太高破壞該設置的目的。合併代理程序將不分配新範圍即使舊的範圍是幾乎完全使其更有可能填滿,從而導致在下一個合併前的錯誤。

重新發布的特殊注意事項

使用合併複製中,您可以將複製的發佈服務器和訂閱服務器的層次結構中的數據。例如對於您可能會將數據複製從中央區域的服務器到企業服務器和訂閱服務器的本地城市區域服務器。首先,您將數據從中央服務器發佈和設置區域服務器從中央發佈服務器的訂閱。然後"重新發布"該區域的訂閱服務器上服務器,並設置從訂閱服務器在葉節點城市區域的發佈服務器的訂閱。

前面的示例顯示討論過上下文中的一個發佈服務器和一個或多個訂閱服務器的標識範圍的管理。當多個級別的發佈服務器和訂閱服務器定義在拓撲中時,您必須請記住,訂閱服務器的範圍從其發佈服務器的範圍分配。滿發佈服務器的區域時該發佈服務器必須請求新的範圍從其發佈服務器,和等等最多爲頂節點。由於這個原因,您必須進行範圍相當大,最高級別出版物和字號逐漸減小的層次結構的較低的級別。

標識範圍和多個發佈

使用合併複製可以發佈一個表中一個以上的合併複製出版物,Publisher 表可能是一個事務複製發佈的訂閱服務器。因爲在不同的 ranged 的標識中的設置不同的發佈,可以定義文章,您必須注意 @ auto_identity_range 爲使用相同的設置,@ pub_identity_range@ identity_range,和 閾值 跨所有發佈。

託管 Ranged 標識的其他方法

自定義內置的標識範圍管理

您可以實現自己獨立於複製的標識範圍。基本的要求如下所示: •使用 NOT FOR REPLICATION 選項標識列上。

•定義每個數據庫種子值,以便每個訂閱服務器上啓動在不同的值遞增。

•定義 CHECK 約束,以防止值結果溢出範圍的數據庫。

本文的表示例"一應俱全標識"部分中說明如何實現的標識範圍。但是,如該節所述難度來自當前區域已滿時分配新的範圍。尤其是在斷開連接的數據庫不能連接到單個的主控服務器的管理範圍。

當有相對較少插入數據庫中,,您不想處理的使用合併複製的功能的管理的問題時,此選項纔在情況下非常有用。

複合主關鍵字

您可以發佈帶有標識列的表並不使用託管的範圍。但是,若唯一鍵衝突必須定義複合鍵的約束或基於標識加上其他的數據庫將不能重複值的索引。

一種很好的選擇是使用 @ @ SERVERNAME 或 $ SUSER_SNAME() 之類的函數的表中包含計算所得的列。您的表可能已有使用適合這一需要另一個目的列。然後,您可以定義主鍵或唯一約束基於標識列和另一列。

第一個問題是複合鍵中的值的組合必須在複製拓撲是唯一的。如果例如對於用戶可以連接到不同的服務器,這些值不可能是唯一的。下面是一個示例: 

名爲"mergeuser"用戶可以連接到兩個不同的服務器,並且插入一行。在這兩個的服務器上現在計算函數 SUSER_SNAME 的列中包含值"mergeuser。如果在每個服務器上的標識列的值 (如 101) 相同,複合鍵在這兩個服務器之間不是唯一的和更高版本合併導致重複鍵衝突。 

使用此技術第二個問題是 ID 值經常用於需要 (如客戶和發票標識其中值中包括服務器名稱或用戶名稱可能不正確地。

最後,有一般性問題與具有複合鍵。如果表由另一個表中的外鍵約束引用,該表還必須具有兩個列。這使得 TRANSACT-SQL 代碼更難,而且可能比單列唯一索引不太最佳複合索引中使用多個列。 

隨機值

您還可以使用 TRANSACT-SQL RAND 函數生成的 ID 值。但是,這些值不是一致性的始終可接受的值中期望遞增的值和其他類型的用戶。雖然 RAND 函數不能保證隨機性,它不能保證唯一性。具體取決於 RAND 函數的使用方式沒有的隨機值將被複制某些時候在將來的統計概率。

GUID (唯一標識符) 列

使用遞增的值在最後一種替代方法是使用"guid"列或列的唯一標識符數據類型定義的和,使用由 NEWID 函數生成的值填充的列。這些值始終被保證是唯一的因此它們可能是一種很好的候選方案。這些值是以這種格式: 

9aaa35ae-d5f0-4 C 24-bf92-7ef20740c995 

由於其長度和格式中的不是非常友好的用戶必須手動處理的值。如果表是通過代碼嚴格地訪問,而不使用的用戶,這是實際一種非常好的選擇。如果您要發佈與合併複製表,表必須具有唯一標識符列 (連同 ROWGUIDCOL 屬性和唯一索引) 使您不必進行任何特殊的注意事項的標識值。

回到頂端

引用

SQL Server 2000 叢書聯機 ; 主題:"使用 NOT FOR REPLICATION""sp_adjustpublisheridentityrange";"規劃應用程序開發"管理標識值 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章