Sql-Server

由於不存在的外鍵,複製失敗

  • April 17, 2020

我一直在嘗試讓以前工作的複制開始工作。

我嘗試了很多設置,但我似乎無法使其工作。

這是場景。我從目標數據庫(稱為 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 上絆倒,我只能建議放棄訂閱,也許也放棄發布並從頭開始。

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