Oracle
 sql >> Database >  >> RDS >> Oracle

Come estendere Liquibase per generare registri delle modifiche con stored procedure, funzioni e trigger?

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 è:

  1. 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.
  2. 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.)
  3. 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.
  4. 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
  5. Le classi Msising*ChangeGenerator potrebbero restituire istanze RawSqlChange oppure potresti creare nuove implementazioni di Change come CreateTriggerChange.