我正在編寫一個SSIS包,在SQL任務中,我必須從表中刪除一條記錄。該記錄與某些表相關聯,這些相關表可能與其他表相關。所以當我試圖刪除一條記錄時,我應該首先刪除其他表中的所有引用。在SQL Server 2005中手動級聯刪除
我知道,設置級聯刪除是實現此目的的最佳選擇。但是,這是一個遺留數據庫,不允許進行此更改。而且,這是一個交易數據庫,可以避免應用程序意外刪除。
有沒有什麼辦法讓SQL Server提供框架級聯刪除查詢?或者手動刪除刪除列表是唯一的選擇?
我正在編寫一個SSIS包,在SQL任務中,我必須從表中刪除一條記錄。該記錄與某些表相關聯,這些相關表可能與其他表相關。所以當我試圖刪除一條記錄時,我應該首先刪除其他表中的所有引用。在SQL Server 2005中手動級聯刪除
我知道,設置級聯刪除是實現此目的的最佳選擇。但是,這是一個遺留數據庫,不允許進行此更改。而且,這是一個交易數據庫,可以避免應用程序意外刪除。
有沒有什麼辦法讓SQL Server提供框架級聯刪除查詢?或者手動刪除刪除列表是唯一的選擇?
SQL Server提供的幀級聯刪除的方式是使用ON DELETE CASCADE
,這是你所說的不能使用的。
它可以查詢到元數據,以獲得其他表受影響的記錄列表,但它會變得更加複雜,因爲你要刪除之前刪除約束(以及元數據參考)。
您將需要在一個單一的交易:
查詢的元數據,以獲得受影響的表的列表。 這需要遞歸,以便可以獲得受第一層影響的表,然後受受受第一層影響的受影響的表等,等等。
放下限制。 由於與上面列出的相同的原因,這也需要遞歸。
刪除所有受影響的表的結果
重新啓用限制
其他人可能有一個更優雅的解決方案,但我想這可能是它。
在.NET中使用SQL管理對象也可以更容易地完成,如果這是一個選項。
我也應該澄清,我不認可這個,因爲問題的可能性非常高。
我認爲你最安全的做法是手動寫出刪除。
如果我正在進行遞歸刪除,那麼需要刪除並重新創建約束。刪除約束條件是覆蓋約束條件設置的規則。在您的建議,我們是從葉來根紀念約束。 – SaravananArumugam
但是您提供的信息確實對我有幫助。感謝您的答覆。 – SaravananArumugam
@Sarav - 如果你留在原地的限制,您將需要確保在遞歸查詢使用相反的順序。如果您放棄限制,訂單將無關緊要。 – JNK
我一直建議不要使用「ON DELETE CASCADE」原因很明顯 –
可能你或許標誌着紀錄「已刪除」,而不是「硬」刪除? –
@Mitch ......不夠明顯(對我來說)。什麼原因,應該避免刪除級聯......只是意外刪除行的意外後果,還是有其他原因,你避免它?我覺得它非常有用。 –