2014-03-04 30 views
4

當您嘗試在現有數據庫上生成更改日誌時,Liquibase有一些限制。它不會導出以下類型的對象:如何使用存儲過程,函數和觸發器來擴展Liquibase以生成更改日誌?

  • 存儲過程,函數,包
  • 觸發器
  • 類型

參考:http://www.liquibase.org/documentation/generating_changelogs.html

據我瞭解,我需要開發我自己的liquibase.snapshot.SnapshotGenerator實現。我知道如何從Oracle中獲取這些類型的對象,但是我在關於如何從Liquibase實現這樣的接口方面有點遺憾。

理想我猜liquibase.database.Database接口也應擴大到添加以下額外的方法:

  • public abstract boolean supportsPackages();
  • public abstract boolean supportsFunctions();
  • public abstract boolean supportsStoredProcedures();
  • public abstract boolean supportsTriggers();
  • public abstract boolean supportsTypes();
+0

這方面的進展如何? – sakhunzai

+0

@bgillis,有什麼進展? –

回答

4

您說得對,一般策略是創建一個實現SnapshotGenerator的新類,但還需要執行其他幾個步驟。一般快照過程如下:

  1. Liquibase搜索SnapshotGenerator實現,併爲它在數據庫中找到的每個對象調用addsTo()。對於你的類型,你可能需要一個快速的「如果傳遞的對象instanceof模式」,因爲它們是屬於模式一部分的類型。
  2. 您將需要創建實現DatabaseObject的新Package,StoredProcedure等對象。它們將會像liquibase.structure.core.Table類一樣捕獲對象的狀態。它們在您的SnapshotGenerator.addsTo()方法中創建,以便於識別(名稱,架構等設置)
  3. 所有通過addsTo()方法添加的對象都會通過您的SnapshotGenerator.snapshotObject()方法這將拉動任何你最初沒有得到的額外的元數據,比如存儲過程文本等。
  4. 一旦liquibase有一個包含你的對象的快照,它將快照與另一個(在generateChangeLog情況下是一個空的快照)進行比較以確定什麼對象缺失,意外,並在第二個快照中更改。然後它查找MissingObjectChangeGenerator,UnexpectedObjectChangeGenerator和ChangedObjectChangeGenerator的實現。對於generateChangeLog,只會有「丟失」的對象,所以你會實現MissingTriggerChangeGenerator,MissingPackagedChangeGenerator等等。他們的工作是創建Change實例來創建缺失的對象
  5. Msising * ChangeGenerator類可以返回RawSqlChange實例,或者您可以創建新的實現更改諸如CreateTriggerChange。
+0

感謝Nathan總結了添加對額外數據庫對象的支持的主要步驟。我將在未來幾周詳細瞭解API。 – bgillis

相關問題