在事務中修改表結構?
在 Oracle(可能還有其他地方)中,執行 ALTER TABLE 語句將對目前事務執行隱式送出。
我們有一個工具(用 Java 編寫)應該通過以下方式修改模式:
- 添加一些列
- 刪除一些列
- 使用新的模式佈局更新描述表
編寫的工具將向使用者顯示目前模式佈局並允許他修改它。(基本上在某些表中添加或刪除自定義“屬性”列)一旦他滿意,他就可以應用他的更改。
請注意:基本模式佈局,以及您需要 ALTER TABLE 來更改某些內容的事實是由標準預定義的,我們無法更改,因為其他工具不再起作用。
現在的問題是我們不能在單個事務中執行這些更改,因為 AFAIK,不可能在一個事務中執行多個 ALTER TABLE 語句。
如果在應用更改時出現問題,我們有哪些選項可以“回滾”到初始狀態?
注意:這裡有人提出了 RESTORE POINT + FLASHBACK ——從這個(Java)工具呼叫它是個好主意嗎?(在某些應該使用該工具的站點,我們不會完全控制數據庫實例。)
注:Oracle 10g2 及以上
由於 DDL 隱式送出,“回滾”更改的唯一方法是構造反向操作並將其應用於還原更改,如 a_horse_with_no_name 所述。
然而,建構這樣的回滾並不總是那麼簡單。如果數據可以在類型修改(varchar2(10)-> varchar2(50),數字-> varchar2)之間寫入表並回滾,那麼您還必須檢查新數據在恢復時是否有效原始類型(或執行一些轉換)。請注意,在大型表上刪除列可能需要一些時間並生成大量重做。
您還必須警惕由於這些更改而使數據庫和其他應用程序依賴項上的任何儲存過程無效。
在這種情況下,閃回選項對您沒有幫助。對錶進行 DDL 更改後,您無法使用閃回將其恢復到之前的狀態。嘗試這樣做會給你錯誤:
ORA-01466: 無法讀取數據 - 表定義已更改
閃回您的完整數據庫將是矯枉過正,也不可能從 Java 應用程序 - 您需要關閉然後掛載數據庫才能完成此操作。
這一切都提出了你的工具是做什麼的問題。如果您只需要一個 GUI 供人們編輯表,那麼像 Oracle SQL Data Modeler 之類的工具可以完成此操作並為您生成 DDL 腳本。然後可以對這些進行驗證、測試、建構適當的回滾並將其應用於數據庫。修改(生產)數據庫的結構應該小心並經過測試,以確保所有更改都是有效的!