如何扩展Liquibase以生成包含存储过程,函数和触发器的更改日志?

时间:2014-03-04 12:40:37

标签: oracle stored-procedures liquibase changelog

当您尝试在现有数据库上生成更改日志时,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();

1 个答案:

答案 0 :(得分:5)

你是对的,一般策略是创建一个实现SnapshotGenerator的新类,但是你还需要做其他几个步骤。一般快照过程是:

  1. Liquibase搜索SnapshotGenerator实现,并为在数据库中找到的每个对象调用addsTo()。对于您的类型,您可能需要一个快速的“if if object objectof Schema”,因为它们是作为模式一部分的类型。
  2. 您需要创建实现DatabaseObject的新Package,StoredProcedure等对象。他们将喜欢liquibase.structure.core.Table类并捕获对象的状态。它们在您的SnapshotGenerator.addsTo()方法中创建,以便可识别(名称,架构等设置)
  3. 然后,通过您的SnapshotGenerator.snapshotObject()方法运行由addsTo()方法添加的所有对象,该方法将提取您最初未获得的任何其他元数据,例如存储过程文本等。
  4. 一旦liquibase有一个包含对象的快照,它会将快照与另一个快照(在generateChangeLog情况下为空快照)进行比较,以确定第二个快照中哪些对象丢失,意外和更改。然后,它查找MissingObjectChangeGenerator,UnexpectedObjectChangeGenerator和ChangedObjectChangeGenerator的实现。对于generateChangeLog,只会有“缺失”对象,因此你要实现MissingTriggerChangeGenerator,MissingPackagedChangeGenerator等。他们的工作是创建Change实例来创建缺少的对象
  5. Msising * ChangeGenerator类可以返回RawSqlChange实例,也可以创建Change的新实现,例如CreateTriggerChange。