2011-08-08 63 views
0

我正在編寫一個SSIS包,在SQL任務中,我必須從表中刪除一條記錄。該記錄與某些表相關聯,這些相關表可能與其他表相關。所以當我試圖刪除一條記錄時,我應該首先刪除其他表中的所有引用。在SQL Server 2005中手動級聯刪除

我知道,設置級聯刪除是實現此目的的最佳選擇。但是,這是一個遺留數據庫,不允許進行此更改。而且,這是一個交易數據庫,可以避免應用程序意外刪除。

有沒有什麼辦法讓SQL Server提供框架級聯刪除查詢?或者手動刪除刪除列表是唯一的選擇?

+0

我一直建議不要使用「ON DELETE CASCADE」原因很明顯 –

+0

可能你或許標誌着紀錄「已刪除」,而不是「硬」刪除? –

+0

@Mitch ......不夠明顯(對我來說)。什麼原因,應該避免刪除級聯......只是意外刪除行的意外後果,還是有其他原因,你避免它?我覺得它非常有用。 –

回答

1

SQL Server提供的幀級聯刪除的方式是使用ON DELETE CASCADE,這是你所說的不能使用的。

它可以查詢到元數據,以獲得其他表受影響的記錄列表,但它會變得更加複雜,因爲你要刪除之前刪除約束(以及元數據參考)。

您將需要在一個單一的交易:

  • 查詢的元數據,以獲得受影響的表的列表。 這需要遞歸,以便可以獲得受第一層影響的表,然後受受受第一層影響的受影響的表等,等等。

  • 放下限制。 由於與上面列出的相同的原因,這也需要遞歸。

  • 刪除所有受影響的表的結果

  • 重新啓用限制

其他人可能有一個更優雅的解決方案,但我想這可能是它。

在.NET中使用SQL管理對象也可以更容易地完成,如果這是一個選項。

我也應該澄清,我不認可這個,因爲問題的可能性非常高。

我認爲你最安全的做法是手動寫出刪除。

+0

如果我正在進行遞歸刪除,那麼需要刪除並重新創建約束。刪除約束條件是覆蓋約束條件設置的規則。在您的建議,我們是從葉來根紀念約束。 – SaravananArumugam

+0

但是您提供的信息確實對我有幫助。感謝您的答覆。 – SaravananArumugam

+0

@Sarav - 如果你留在原地的限制,您將需要確保在遞歸查詢使用相反的順序。如果您放棄限制,訂單將無關緊要。 – JNK