使用 NOT FOR REPLICATION
Microsoft SQL Server 2000 複製使用 NOT FOR REPLICATION 選項在分區環境中實現標識值範圍。當用來自不同網站的行分區發行資料表時,NOT FOR REPLICATION 選項在事務或合併式複寫中特別有用。
當複製代理程式用任何登入串連到某個表時,該表上的所有 NOT FOR REPLICATION 選項都將被啟用。設定該選項時,SQL Server 2000 在複製代理程式所添加的行上保留起始標識值,但是繼續在其他使用者所添加的行上增加標識值。當使用者將某個新行添加到表時,標識值以通常的方式增加。當複製代理程式將該新行複製到訂閱伺服器時,在將該行插入到訂閱伺服器表中時不更改標識值。
例如,考慮這樣的表,它包含從兩個源插入的行:發行伺服器 A 和發行伺服器 B。通過將值從 1 增加到 1000 標識在發行伺服器 A 上插入的行,通過將值從 1001 增加到 2000 標識在發行伺服器 B 上插入的行。如果發行伺服器 A 上的進程將行從本地插入到表中,則 SQL Server 指派第一行的值為 1,第二行的值為 2,依此類推。同樣,如果發行伺服器 B 上的進程將行從本地插入到表中,則指派第一行的值為 1001,第二行的值為 1002,依此類推。當將發行伺服器 A 上的行複製到發行伺服器 B 上時,標識值仍然是 1、2,依此類推,但將不重設發行伺服器 B 上的本地種子值。
無論 IDENTITY 屬性在複製中的作用如何,它本身不強制唯一性,而只插入下一個值。雖然可以使用 SET IDENTITY INSERT 提供顯式值,但該函數不適合複製,因為它還重新賦值。NOT FOR REPLICATION 選項是專門為使用複製的應用程式建立的。例如,如果沒有此選項,只要發行伺服器 B(值為1001)中的第一行傳播到發行伺服器 A,則發行伺服器 A 的下一個值將是 1002。NOT FOR REPLICATION 選項告訴 SQL Server 2000 當提供顯式值時,複製進程獲得一個棄權聲明,並且不應重設本地值的種子值。每個使用此選項的發行伺服器都獲得相同的重新賦值棄權聲明。
在複製可以處理識別屬性之前,必須通過自訂預存程序對完整的列列表使用 INSERT、UPDATE 和 DELETE 語句。如果未使用完整的列列表,則將返回一個錯誤資訊。
以下程式碼範例說明如何在每個發行伺服器上的不同範圍執行標識:
在發行伺服器 A 上,從 1 開始以 1 遞增。
CREATE TABLE authors ( COL1 INT IDENTITY (1, 1) NOT FOR REPLICATION PRIMARY KEY )
在發行伺服器 B 上,從 1001 開始以 1 遞增。
CREATE TABLE authors ( COL1 INT IDENTITY (1001, 1) NOT FOR REPLICATION PRIMARY KEY )
啟用 NOT FOR REPLICATION 選項之後,從複製代理到發行伺服器 A 的串連插入帶有諸如 1, 2, 3, 4 值的行。這些值(即 1, 2, 3, 4)不做任何更改地複製到發行伺服器 B。來自發行伺服器 B 上的複製代理程式的串連獲得值 1001、1002、1003 和 1004。這些值將不做任何更改地複製到 A。當分發或合并所有資料後,兩個發行伺服器都有值 1、2、3、4、1001、1002、1003 和 1004。下一個在發行伺服器 A 上本地插入的值是 5。下一個在發行伺服器 B 上本地插入的值是 1005。
建議始終將 NOT FOR REPLICATION 選項與 CHECK 條件約束一起使用,以確保指派的標識值在允許範圍內。例如:
CREATE TABLE sales
(sale_id INT IDENTITY(100001,1)
NOT FOR REPLICATION
CHECK NOT FOR REPLICATION (sale_id <= 200000),
sales_region CHAR(2),
CONSTRAINT id_pk PRIMARY KEY (sale_id)
)
即使用 SET IDENTITY INSERT,所有本地插入的值也必須遵守範圍。但是,複製進程仍然免於檢查。
說明 如果使用的是帶即時更新訂閱伺服器選項的事務複製,則不要使用 IDENTITY NOT FOR REPLICATION 設計。相反,只在發行伺服器上建立 IDENTITY 屬性,並使訂閱伺服器只使用基礎資料型別 (Elementary Data Type)(例如 int)。這樣一來,就始終在發行伺服器上產生下一個標識值。