2014-01-20 45 views
0

我有一組表,我目前正試圖爲表設置正確的關係。濃縮版本如下。解決循環和多個級聯路徑

Users 
    ID INT NOT NULL 

Activities 
    ID INT NOT NULL 
    UserID INT NULL 

Logs 
    ID INT NOT NULL 
    UserID INT NULL 
    ActivityID INT NULL 

我有關係,從兩個ActivitiesLogsUsers.IDActivityID與回Activities.IDUserID

我已經設置Activities.UserIDLogs.UserID在刪除時設置爲null,並在更新時級聯。我的問題是,當我試圖設置相同的更新和刪除功能Logs.ActivityID,但我得到一個關於「可能導致週期或多個級聯路徑」的錯誤。我的問題是,Logs需要一個用戶,並且不需要Activity,但Logs確實有一個Activity需要更新,如果Activity發生更改時。

我有什麼辦法,不涉及有兩個單獨的Logs表,並且不涉及手動更新Logs表。這在SQL Server 2012中甚至可能嗎?

+0

爲什麼你需要這樣做級聯?我懷疑,刪除一個用戶是一個非常罕見的事件,你可以編寫自己的刪除邏輯,在刪除用戶之前手動刪除(或設置NULL)值。 –

+1

如果我實際上不能使用它們,級聯和設置爲null會有什麼意義?重點是,他們在那裏被使用,我希望能夠解決SQL服務器在幾乎所有其他的SQL引擎上的缺點,而不必編寫刪除和空邏輯我自己 – bizzehdee

+0

很多東西存在考慮到最簡單的實現編寫的SQL Server,並且未針對更復雜的實現進行測試(因此不支持)。 FWIW,由於這個和其他原因,我從未在生產中使用CASCADE。如果在有多條路徑的情況下讓CASCADE自動工作對您來說很重要,那麼請務必使用另一個數據庫平臺。當然,你會花更多的時間來轉換你的模式和代碼,而不是編寫一個程序來爲你做這件事...... –

回答

7

SQL Server不支持多個級聯路徑。解決此限制的選項有:

  1. 編寫自己的邏輯以處理多個級聯路徑(推薦)。

  2. 更改您的模式,以便不需要多個級聯路徑。

  3. 等待SQL Server來解決這個問題。不要屏住呼吸 - 這是多年來的侷限。查看這些連接項目:

    a。 http://connect.microsoft.com/SQLServer/feedback/details/126159/cascade-updates
    b。 http://connect.microsoft.com/SQLServer/feedback/details/307723/allow-multiple-cascade-paths-for-foreign-key-and-on-dalete-update-cascade

    請注意他們是怎麼一直說「我們現在沒有時間了,我們會考慮下一個版本」?這不是那種銷售軟件的東西,因爲人們通常會對自己的邏輯編碼感到滿意。

  4. 遷移到支持多級聯路徑的數據庫平臺(聽起來你覺得你有很多選擇,但我不認爲你這樣做,我不知道你通過切換犧牲了什麼,甚至沒有計數移植你的模式和代碼)。

+0

這是一個新項目,我完全可以切換到mysql或pgsql,特別是使用sql-server對SQL的有限掌握,我可以或多或少地編寫我現在具有的表和數據的腳本,並在新引擎。這可能是我最終選擇的選擇。 – bizzehdee

+2

@bizzehdee太棒了,玩得開心!大多數人沒有這種靈活性。希望稍後在這個項目中,你不會遇到使你想要切換回來的mysql或pgsql的限制。 –

+1

@bizzehdee這不是對「sql」的有限掌握。事實上,有許多邏輯理由不支持多級聯路徑,這就是爲什麼大多數rdbms會迫使任何認爲這是一個好主意的開發人員自己做。當然,mysql和它的標準破解方式可能是您現在很好的選擇,現在您會後悔的。這提出了一個很好的觀點 - 想想你未來的自我,以及他們會爲了這樣一種「獨特」的設計而憎恨你現在的自我。 – swasheck

相關問題