Вие сте прав, че общата стратегия е да се създаде нов клас, който имплементира SnapshotGenerator, но има още няколко стъпки, които също трябва да направите. Общият процес на моментна снимка е:
- Liquibase търси реализации на SnapshotGenerator и извиква addsTo() за всеки обект, който намира в базата данни. За вашите типове вероятно искате бързо „ако е предаден обект instanceof Schema“, защото те са типове, които са част от схема.
- Ще трябва да създадете нови обекти Package, StoredProcedure и т.н., които имплементират DatabaseObject. Те ще бъдат като клас liquibase.structure.core.Table и ще улавят състоянието на обекта. Те се създават във вашия метод SnapshotGenerator.addsTo() до точката, в която могат да бъдат идентифицирани (набор име, схема и т.н.)
- Всички обекти, които се добавят от метода addsTo(), след това се изпълняват през вашия метод SnapshotGenerator.snapshotObject(), който ще изтегли всички допълнителни метаданни, които не сте получили първоначално, като например текст на съхранена процедура и т.н.
- След като liquibase има моментна снимка, съдържаща вашите обекти, тя сравнява моментната снимка с друга (в случай на generateChangeLog празна моментна снимка), за да определи кои обекти липсват, неочаквани и променени във втората моментна снимка. След това търси реализации на MissingObjectChangeGenerator, UnexpectedObjectChangeGenerator и ChangedObjectChangeGenerator. За generateChangeLog ще има само „липсващи“ обекти, така че ще приложите MissingTriggerChangeGenerator, MissingPackagedChangeGenerator и т.н. Тяхната работа е да създават екземпляри на Change за създаване на липсващите обекти
- Класовете Msising*ChangeGenerator могат да върнат екземпляри на RawSqlChange или можете да създадете нови реализации на Change, като CreateTriggerChange.