MSSQLSERVER_1785
適用於:SQL Server
詳細資料
屬性 | 值 |
---|---|
產品名稱 | SQL Server |
事件識別碼 | 1785 |
事件來源 | MSSQLSERVER |
元件 | SQLEngine |
符號名稱 | CRTFKINVTOPO |
訊息文字 | 在資料表 '%.ls'上導入 FOREIGN KEY 條件約束 '%.ls' 可能造成循環或多個串聯路徑。 請指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或者修改其他 FOREIGN KEY 條件約束。 |
說明
因為在 SQL Server 中,數據表不能出現在由 或 UPDATE
語句啟動DELETE
的所有級聯引用動作清單中一次以上,所以您會收到此錯誤訊息。 級聯引用動作的樹狀結構必須只有一個路徑,才能在級聯參考動作樹狀結構上的特定數據表。
如下的錯誤訊息會回報給使用者:
伺服器:Msg 1785、層級 16、狀態 1、第 1 行在數據表 'table2' 上引進 FOREIGN KEY 條件約束 'fk_two',可能會導致迴圈或多個串聯路徑。 請指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或者修改其他 FOREIGN KEY 條件約束。 伺服器:訊息 1750、層級 16、狀態 1、第 1 行無法建立條件約束。 請參閱先前的錯誤
使用者動作
若要解決此問題,請建立外鍵,以在串連引用動作清單中建立數據表的單一路徑。
您可以透過數種方式強制執行引用完整性。 宣告式引用完整性 (DRI) 是最基本的方式,但它也是最不具彈性的方式。 如果您需要更多彈性,但仍想要高度的完整性,您可以改用觸發程式。
其他相關資訊
下列範例程式代碼是產生錯誤訊息的FOREIGN KEY 建立嘗試範例:
USE tempdb
GO
CREATE TABLE table1 (user_ID INTEGER NOT NULL PRIMARY KEY, user_name
CHAR(50) NOT NULL)
GO
CREATE TABLE table2 (author_ID INTEGER NOT NULL PRIMARY KEY, author_name
CHAR(50) NOT NULL, lastModifiedBy INTEGER NOT NULL, addedby INTEGER NOT NULL)
GO
ALTER TABLE table2 ADD CONSTRAINT fk_one FOREIGN KEY (lastModifiedby)
REFERENCES table1 (user_ID) ON DELETE CASCADE ON UPDATE cascade
GO
ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1(user_ID) ON DELETE NO ACTION ON UPDATE cascade
GO
--this fails with the error because it provides a second cascading path to table2.
ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1 (user_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
-- this works.