Sql-Server

身份列如何複製?

  • December 10, 2013

在事務複製期間,我們有數據從伺服器 A 傳輸到伺服器 B。

假設我們要在伺服器 A 上的表上重新設置標識列(無論出於何種原因),這將如何影響伺服器 B 上的數據?

我的直覺會說伺服器 A 上的數據將使用新播種的身份,並將按原樣發送到伺服器 B(並且伺服器 B 將具有使用新身份的內容),但我不確定這是否是正確的。

當您有 Identity 列並且這是表的主鍵時,這總是很棘手。

根據我處理 T-Rep 和 Merge 的經驗,我建議使用NOT FOR REPLICATIONNO。預設情況下,它設置為 YES。您可以在 sql 2005 及更高版本上使用sys.sp_identitycolumnforreplication.

如果您不更新訂戶端的數據,那應該沒問題。

要回答您的問題:

假設我們要在伺服器 A 上的表上重新設置標識列(無論出於何種原因),這將如何影響伺服器 B 上的數據?

考慮到您沒有更新訂閱者上的數據,當您想要重新設定種子時,您應該始終從標識列中獲取最大值,然後相應地重新設定值。

您可以使用下面的 sql 來找出答案:

SELECT  QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' +  QUOTENAME(t.name) AS TableName, 
       c.name AS ColumnName,
       IDENT_CURRENT(SCHEMA_NAME(t.schema_id)  + '.' + t.name) AS CurrentIdentityValue,
       IDENT_INCR (SCHEMA_NAME(t.schema_id) + '.' + t.name) as Identity_increment
   FROM    sys.columns AS c 
       INNER JOIN  sys.tables AS t ON t.[object_id] = c.[object_id]
       WHERE   c.is_identity = 1 
 -- write here the table name if you want to filter for specific table
   and t.name like '%TABLE_NAME%'

例如考慮下面的客戶表:

TableName     ColumnName    CurrentIdentityValue    Identity_increment
[dbo].[customer]    id         7                    1

現在,如果您想以某種方式重新設定身份值,您可以執行

dbcc checkident ('customer',reseed,8 ) 

這意味著它將目前標識值設置為 8,因此下次將任何行插入表中時,它將具有目前標識值 8 (CurrentIdentityValue) + 1(Identity_increment) = 9。

你必須小心這樣做,因為這可能會導致身份差距。

您可以做的其他事情是:

  • 分區
  • sp_addaritcle使用參數的手動身份範圍管理解決方案,例如@identity_range ,@pub_identity_range and @threshold

繼續閱讀:

  1. 複製中的身份危機——希拉里·科特(Hilary Cotter)
  2. 關於“身份範圍管理”的所有資訊 - Chris Skorlinski

引用自:https://dba.stackexchange.com/questions/54781