Sql-Server
身份列如何複製?
在事務複製期間,我們有數據從伺服器 A 傳輸到伺服器 B。
假設我們要在伺服器 A 上的表上重新設置標識列(無論出於何種原因),這將如何影響伺服器 B 上的數據?
我的直覺會說伺服器 A 上的數據將使用新播種的身份,並將按原樣發送到伺服器 B(並且伺服器 B 將具有使用新身份的內容),但我不確定這是否是正確的。
當您有 Identity 列並且這是表的主鍵時,這總是很棘手。
根據我處理 T-Rep 和 Merge 的經驗,我建議使用
NOT FOR REPLICATION
NO。預設情況下,它設置為 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
繼續閱讀: