Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment étendre Liquibase pour générer des journaux de modifications avec des procédures stockées, des fonctions et des déclencheurs ?

Vous avez raison de dire que la stratégie générale consiste à créer une nouvelle classe qui implémente SnapshotGenerator, mais vous devez également effectuer quelques autres étapes. Le processus général d'instantané est le suivant :

  1. Liquibase recherche les implémentations de SnapshotGenerator et appelle addTo() pour chaque objet qu'il trouve dans la base de données. Pour vos types, vous voulez probablement un rapide "si passé objet instanceof Schema" car ce sont des types qui font partie d'un schéma.
  2. Vous devrez créer de nouveaux objets Package, StoredProcedure, etc. qui implémentent DatabaseObject. Ils seront comme la classe liquibase.structure.core.Table et captureront l'état de l'objet. Ils sont créés dans votre méthode SnapshotGenerator.addsTo() au point d'être identifiables (nom, schéma, etc.)
  3. Tous les objets ajoutés par la méthode addTo() sont ensuite exécutés via votre méthode SnapshotGenerator.snapshotObject() qui extrait toutes les métadonnées supplémentaires que vous n'avez pas obtenues à l'origine, telles que le texte de la procédure stockée, etc.
  4. Une fois que liquibase a un instantané contenant vos objets, il compare l'instantané à un autre (dans le cas de generateChangeLog, un instantané vide) pour déterminer quels objets sont manquants, inattendus et modifiés dans le deuxième instantané. Il recherche ensuite les implémentations de MissingObjectChangeGenerator, UnexpectedObjectChangeGenerator et ChangedObjectChangeGenerator. Pour generateChangeLog, il n'y aura que des objets "manquants", vous devez donc implémenter MissingTriggerChangeGenerator, MissingPackagedChangeGenerator, etc. Leur travail consiste à créer des instances de changement pour créer les objets manquants
  5. Les classes Msising*ChangeGenerator peuvent renvoyer des instances RawSqlChange ou vous pouvez créer de nouvelles implémentations de Change telles que CreateTriggerChange.