2013-12-09 53 views
1

我有一個情況我必須:回滾DML失敗

  1. 禁用FK約束一些表,
  2. 用於由外鍵引用的主鍵更改字段值(也更新爲匹配),
  3. 重新啓用從步驟FK約束1.

的問題是,如果從第2步中的變化做了主鍵字段不consi重新啓用在步驟3中的約束可能會失敗帶有外鍵引用字段的支架。我想趕上這種情況並回滾步驟2中所做的更改。據我所知,運行DDL語句(如啓用約束)首先會發出提交,之後我無法回滾步驟2中所做的更改。

有沒有辦法在一個獨立的腳本中實現這一點?該過程應該完全通過或回滾,就好像什麼也沒發生一樣。還是有沒有辦法可以恢復到以前的狀態,而不需要備份/恢復整個數據庫?

+2

這是一個單用戶進程嗎?如果是這樣,您可能可以使用閃回表恢復到相關表的以前版本。 –

回答

2

我的解決方法是在更新之前鎖定每個表,在重新啓用約束之前運行查詢手動檢查是否存在違規。如果有任何違規可以回滾更新,否則約束重新啓用將執行提交併釋放表鎖。

0

您可以嘗試在自主事務中執行DDL。這樣,它將與您的DML隔離。如果DDL失敗,您仍然可以回滾DML。但是,如果DDL必須「看到」未提交的DML更改,那麼您就被卡住了。我認爲你不能到達你想去的地方。

+0

我正在禁用FK約束,以便我可以在步驟2中更改PK/FK,所以我不認爲我可以將DDL與DML分開。 –

+0

是的,這是一個問題。傑弗裏的答案是否合理? –