7

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

1 回答 1

7

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

  1. Liquibase 搜索 SnapshotGenerator 实现并为它在数据库中找到的每个对象调用 addTo()。对于您的类型,您可能需要一个快速的“如果传递对象 instanceof Schema”,因为它们是属于模式的类型。
  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 实例,或者您可以创建 Change 的新实现,例如 CreateTriggerChange。
于 2014-03-05T16:25:11.457 回答