2008-09-24 41 views
3

我想設置跟蹤DB模式的變化,例如在this answer描述的一種機制:每個DDL SQL命令是否可逆? [數據庫版本控制]

對於每一個改變您對 數據庫,你寫一個新的遷移。 遷移通常有兩種方法: 採用「向上」方法,其中應用了更改 ,並且 中的「向下」方法取消了更改。一個單一的 命令將使數據庫達到 的日期,並且還可以用於將 數據庫帶入特定版本的 模式。

我的問題如下:每個DDL命令在「向上」的方法是否可逆?換句話說,我們總是可以提供一個「下」的方法嗎?你能想象任何不能「down」的DDL命令嗎?

請不要考慮典型的數據遷移問題,在「up」方法期間,我們會丟失數據:例如將字段類型從datetimeDateOfBirth)更改爲intYearOfBirth),我們正在丟失無法恢復的數據。

回答

4

在sql服務器中,我知道每個DDL命令都是上/下對。

2

除了數據丟失之外,我所做過的每次遷移都是可逆的。這就是說,Rails的提供了一個方法,以紀念遷移爲「破壞性」:

一些變換是無法逆轉的方式破壞 。 這種遷移應該在其下行方法中引發ActiveRecord :: IrreversibleMigration 異常 。

查看API文檔here

+0

即使將數據存儲到本地yml文件(請參閱https://github.com/tomkurt/Reversable-Data-Migration) – 2012-02-12 16:20:55

2

你失去的數據是,你已經確定的情況下,無論是通過轉換,或乾脆DROP列中的「向上」的遷移。

另一個例子是你可以丟棄一個SEQUENCE對象,從而失去它的狀態。 「向下」遷移會重新創建序列,但會從1開始。這可能會導致序列生成重複值。不是如果你是一個空數據庫上進行了遷移,並且你想要的順序在1開始無論如何,但如果你有數據的行一定數量的,你想要的順序問題被重置爲最大價值目前在使用,這是很難做到可靠的,除非你有在該表上的排它鎖。

任何其他DDL是依賴於數據的數據庫中的狀態也有類似的問題。這可能不是擺在首位良好的架構設計,我只是試圖想適合你的問題的任何情況。