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

bgi*_*lis 7 oracle stored-procedures changelog 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();

Nat*_*and 6

正确的总体策略是创建一个实现SnapshotGenerator的新类,但是您还需要执行其他几个步骤。常规快照过程为:

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