Ddl
為什麼某些 DBMS 不允許某些 DDL 語句回滾?
最近我發現 MySQL不支持回滾 DDL,例如“alter table”……習慣了 PostgreSQL,這讓我感到奇怪,但我的一個朋友告訴我,即使是 Oracle 也不允許它。是否有不支持它的技術原因?這對他們來說僅僅是一個“無趣”的功能嗎?
編輯:剛剛發現這個比較。看起來有很多 DBMS確實支持事務性 DDL。
這在 PostgreSQL 中起作用的原因是系統目錄是正常表。因此,例如,創建一個新函式只需要在表中插入一行
pg_proc
,更改列的預設值只需要對 中的某些行進行更新pg_attrdef
,等等。由於表格無論如何都是事務性的,因此您幾乎必須竭盡全力不讓它以這種方式工作。(這裡省略了很多痛苦的實現細節。;-))我想,不知道原始碼,其他數據庫引擎使用一些自定義的內部結構來表示他們的系統目錄資訊。因此,他們必須付出額外的努力,可能會付出很多額外的努力,才能使事務性 DDL 工作,而這顯然不是他們的優先事項。
另一方面,這就是 PostgreSQL 的主要版本升級如此痛苦的原因。其他產品可能會在設計其內部元資料結構時考慮到更改和更新,因此升級到新的主要版本沒有問題。在 PostgreSQL 中,無法將系統目錄表更改為突然看起來像系統目錄表的更新版本,至少在保持系統線上時不會,因為這需要訪問系統目錄。呃。