2014-10-18 39 views
0

我們在我們的生產環境中有一個大型數據庫(100 GB),我們有兩個鏡像。我們使用複製來同步我們的鏡像數據庫(SQL Server 2012上的事務複製)Sql Server複製和標識列

當我們創建複製時,我們的DBA首先從我們的服務器下載完整備份並在鏡像服務器上恢復它,然後配置Publisher -DB)和訂戶(鏡像-1)。一切工作正常,鏡像和生產完美同步。

在每次發佈之前,我們應該使用REAL在我們的UAT服務器上測試我們的系統!數據。所以我們從我們的一個鏡像服務器(現場鏡像)創建備份並將其還原到我們的UAT數據庫。

在我們的數據庫中的所有表有一個PK,如:

[ID] [int] IDENTITY(1,1) NOT NULL 

在我們的UAT數據庫OrderTransaction表ID = 160.000.000的最後一個記錄,但是當我們的應用程序嘗試插入到這個表,系統遭遇引發了一個問題和例外。

違反PRIMARY KEY約束'ID'。不能在對象中插入重複鍵...

系統多試160.000.000(ID = 145.695.000) 我查詢的數據庫這個ID是最後一個ID插入一個整數值較小時的備份生產數據庫恢復到鏡像數據庫並在事務複製啓動之後。 有關生產和鏡像的所有信息都將同步正確,並且兩臺服務器上的表的ID相同且完全相同。

當我在UAT運行此命令或鏡像數據庫是因爲我讀的MSDN,博客和相關的SO問題,這個問題涉及到複製和標識列返回145.695.000

SELECT IDENT_CURRENT('OrderTransaction') 

但是,我如何強制我們的鏡像數據庫增加其生產身份(並接受這個值作爲本地身份值)。或者可能我們應該編寫一個腳本,爲我們的UAT環境中的每個表格進行測試!?

謝謝。

回答

2

如果您在將prod鏡像恢復到UAT時只有問題,那麼您最簡單的解決方案就像您所建議的那樣,可能只是爲每個表編寫腳本。

對於更常見的問題複製和身份問題,您可能會發現this excellent article from Hilary Cotter on Simple-Talk有用。

在本文中,我們探討了如何實現身份管理 複製中的解決方案以避免主鍵衝突。我們看着 劃分和手動和自動身份範圍管理 解決方案。使用自動身份範圍管理的解決方案可以在精心策劃下運行良好

編輯: 這應該所有的身份重置爲當前最大值:

EXEC sp_MSForEachTable ' 
IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1 
DBCC CHECKIDENT (''?'', RESEED)' 

這是一個輕微修改Pinal Dave's work

+0

謝謝, 我正在嘗試編寫腳本,查找所有具有標識ID列並將它們重新設置的表,但在我看來它應該是最後一個解決方案。可能應該有一些方法可以通過SQL Server複製設置以自動方式進行此操作。 – Navid 2014-10-18 20:49:04

+1

該腳本應該非常簡潔。以防萬一,我會發布一條消息。 – 2014-10-18 21:00:31