由於不存在的外鍵,複製失敗
我一直在嘗試讓以前工作的複制開始工作。
我嘗試了很多設置,但我似乎無法使其工作。
這是場景。我從目標數據庫(稱為 DestDB)中刪除了所有 FK 約束。
然後我重新初始化我的複制,當我執行時我得到這個(去辨識的)錯誤:
ALTER TABLE 語句與 FOREIGN KEY 約束“FK_TableOnlyInDestDB_MyReplicatedTable”衝突。衝突發生在數據庫“DestDB”、表“SomeSchema.MyReplicatedTable”、列“MyReplicatedTableId”中。(來源:MSSQLServer,錯誤號:547)
這讓我發瘋,因為該數據庫中不存在指示的 FK。
現在,我確實從另一個數據庫複製了這個數據庫(備份和恢復)。所以我唯一能想到的就是它以某種方式穿越了溪流。
但這似乎不太可能。
任何想法都會很棒!
注意:這是我執行的查詢以確保我沒有 FK(它沒有返回任何行):
use DestDB SELECT f.name AS ForeignKey, OBJECT_NAME(f.parent_object_id) AS TableName, COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
我還檢查以確保有問題的 FK 不在源表上(在我從中複製的數據庫中)。
我也試過:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
還嘗試了 Dropping
MyReplicatedTable
。刪除就好了,複製重新創建了它。(但仍然給了我錯誤。)我嘗試創建一個空數據庫作為訂閱者。效果很好,所以是 DestDB 中的某些東西導致了問題,但是 ERROR 中的 FK 不存在。
很抱歉喚醒了這個死執行緒,但是當問題仍然沒有定論時,我討厭它。無論如何,我遇到了同樣的問題。顯然,SQL 伺服器複製將外鍵保存在“dbo.MSsavedforeignkeys”中,這是我找到阻止程序 FK 的地方。快速
delete dbo.MSsavedforeignkeys where constraint_name = N'FK_TableOnlyInDestDB_MyReplicatedTable'
解決了我的問題。當然,在複製失敗後可能有更多“最佳實踐”的清理方法。
正如 Aaron 所指出的,SQL Server 不會發明對象,因此它必須存在於某個地方。
我最初的想法是,您將複製指向與您想像的不同的數據庫。在“訂閱屬性”對話框中檢查用於創建訂閱的數據庫。
還要檢查您使用的複制類型。如果它是任何雙向形式,它可能會嘗試將該重大更改應用於發布者。
如果這沒有幫助,請檢查您的預設擴展事件會話以查看引發錯誤時實際執行的內容。有關如何執行此操作的詳細資訊,請參閱http://www.brentozar.com/archive/2013/08/what-queries-are-failing-in-my-sql-server/ 。
這應該可以讓你弄清楚發生了什麼。
如果畢竟你確定你在正確的數據庫中並且複制仍然在不存在的 FK 上絆倒,我只能建議放棄訂閱,也許也放棄發布並從頭開始。