Hai ragione sul fatto che la strategia generale è quella di creare una nuova classe che implementi SnapshotGenerator, ma ci sono anche un paio di altri passaggi che devi fare. Il processo di snapshot generale è:
- Liquibase cerca le implementazioni di SnapshotGenerator e chiama addTo() per ogni oggetto che trova nel database. Per i tuoi tipi, probabilmente desideri una rapida "istanza dell'oggetto se passata dello schema" perché sono tipi che fanno parte di uno schema.
- Dovrai creare nuovi oggetti Package, StoredProcedure, ecc. che implementano DatabaseObject. Saranno come la classe liquibase.structure.core.Table e cattureranno lo stato dell'oggetto. Vengono creati nel tuo metodo SnapshotGenerator.addsTo() al punto da essere identificabili (nome, schema, ecc.)
- Tutti gli oggetti aggiunti dal metodo addTo() vengono quindi eseguiti tramite il metodo SnapshotGenerator.snapshotObject() che estrarrà tutti i metadati aggiuntivi non ottenuti in origine, come il testo della procedura memorizzata, ecc.
- Una volta che liquibase ha uno snapshot contenente i tuoi oggetti, confronta lo snapshot con un altro (nel caso generateChangeLog uno snapshot vuoto) per determinare quali oggetti sono mancanti, imprevisti e modificati nel secondo snapshot. Quindi cerca le implementazioni di MissingObjectChangeGenerator, UnexpectedObjectChangeGenerator e ChangedObjectChangeGenerator. Per generateChangeLog ci saranno solo oggetti "mancanti", quindi implementeresti MissingTriggerChangeGenerator, MissingPackagedChangeGenerator ecc. Il loro compito è creare istanze di modifica per creare gli oggetti mancanti
- Le classi Msising*ChangeGenerator potrebbero restituire istanze RawSqlChange oppure potresti creare nuove implementazioni di Change come CreateTriggerChange.