Gérer les marques
En complément des fonctions de pose de marques, il existe plusieurs autres fonctions de gestion des marques.
Commenter une marque
Il est possible d’ennregistrer, modifier ou supprimer un commentaire sur une marque avec :
SELECT emaj.emaj_comment_mark_group(p_group, p_mark, p_comment);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_mark(TEXT) : Marque à commenter. Le mot clé “EMAJ_LAST_MARK” peut être utilisé comme nom de marque à commenter pour indiquer la dernière marque posée.p_comment(TEXT) : Commentaire décrivant la marque. Une valeur NULL supprime tout commentaire existant.
Données retournées
La fonction ne retourne aucune donnée.
Notes
Un commentaire peut aussi être directement ennregistré lors de la pose de la marque.
Les commentaires sont surtout intéressants avec l’utilisation d’Emaj_web, qui les affiche systématiquement dans le tableau des marques d’un groupe. Mais ils sont visibles également dans la colonne mark_comment de la table emaj.emaj_mark.
Rechercher une marque
La fonction emaj_get_previous_mark_group() permet de connaître, pour un groupe de tables, le nom de la dernière marque qui précède soit une date et une heure donnée, soit une autre marque.
SELECT emaj.emaj_get_previous_mark_group(p_group, p_datetime);
ou
SELECT emaj.emaj_get_previous_mark_group(p_group, p_mark);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_datetime(TIMESTAMPTZ) : Date et heure à rechercher.p_mark(TEXT) : Marque à rechercher. Le mot cléEMAJ_LAST_MARKpeut être utilisé comme nom de marque à commenter pour indiquer la dernière marque posée.
Données retournées
La fonction retourne le nom de la marque, ou NULL si aucune marque n’a été trouvée.
** Notes**
Si l’heure fournie est strictement égale à l’heure d’une marque existante, la marque retournée sera la marque qui précède.
Renommer une marque
Une marque existante peut être renommée avec la requête SQL :
SELECT emaj.emaj_rename_mark_group(p_group, p_mark, p_newName);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_mark(TEXT) : Marque à renommer. Le mot cléEMAJ_LAST_MARKpeut être utilisé comme nom de marque pour indiquer la dernière marque posée.p_newMark(TEXT) : Nouveau nom de la marque. Il peut contenir un caractère%représentant l’heure courante au formathh.mm.ss.mmmm. Si le paramètre n’est pas fourni ou a une valeur non NULL ou vide, un nom de marque est généré :MARK_%.
Données retournées
La fonction ne retourne aucune donnée.
Notes
Une marque portant le nouveau nom souhaité ne doit pas déjà exister pour le groupe de tables.
Effacer une marque
Une marque peut également être effacée par l’intermédiaire de la requête SQL :
SELECT emaj.emaj_delete_mark_group(p_group, p_mark);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_mark(TEXT) : Marque à effacer. Le mot cléEMAJ_LAST_MARKpeut être utilisé comme nom de marque pour indiquer la dernière marque posée.
Données retournées
La fonction retourne la valeur 1, c’est à dire le nombre de marques effectivement effacées.
Notes
Le groupe de table peut être actif ou inactif.
Une marque ne peut pas être effacée si c’est la seule marque de son groupe de tables.
Si la marque effacée est la plus ancienne marque du groupe, les lignes des tables de log enregistrées avant cette marque deviennent inutiles et sont donc supprimées.
Effacer les marques les plus anciennes
Pour facilement effacer en une seule opération toutes les marques d’un groupe de tables antérieures à une marque donnée, on peut exécuter la requête :
SELECT emaj.emaj_delete_before_mark_group(p_group, p_mark);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_mark(TEXT) : Nom de la nouvelle plus ancienne marque. Le mot cléEMAJ_LAST_MARKpeut être utilisé comme nom de marque pour indiquer la dernière marque posée.
Données retournées
La fonction retourne le nombre de marques effacées.
Notes
La fonction efface les marques antérieures à la marque spécifiée, cette dernière devenant la nouvelle première marque. Elle supprime également des tables de log toutes les données concernant les mises à jour de tables applicative antérieures à cette marque.
La fonction purge également les événements les plus anciens des tables techniques historisées.
Cette fonction permet ainsi d’utiliser E-Maj sur de longues périodes sans avoir à arrêter et redémarrer les groupes, tout en limitant l’espace disque utilisé pour le log.
Néanmoins, comme cette suppression de lignes dans les tables de log ne peut utiliser de verbe SQL TRUNCATE (contrairement aux fonctions emaj_start_group() ou emaj_reset_group()), la durée d’exécution de la fonction emaj_delete_before_mark_group() peut être plus longue qu’un simple arrêt et relance de groupe. En contrepartie, elle ne nécessite pas de pose de verrou sur les tables du groupe concerné. Son exécution peut donc se poursuivre alors que d’autres traitements mettent à jour les tables applicatives. Seules d’autres actions E-Maj sur le même groupe de tables, comme la pose d’une nouvelle marque, devront attendre la fin de l’exécution d’une fonction emaj_delete_before_mark_group().
Associées, les fonctions emaj_delete_before_mark_group(), et emaj_get_previous_mark_group() permettent d’effacer les marques antérieures à un délai de rétention. Ainsi par exemple, pour effacer toutes les marques (et supprimer les logs associés) posées depuis plus de 24 heures, on peut exécuter la requête :
SELECT emaj.emaj_delete_before_mark_group('mon_groupe',
emaj.emaj_get_previous_mark_group('mon_groupe', current_timestamp - '1 DAY'::INTERVAL));
Protéger une marque contre les rollbacks
Pour compléter le mécanisme de protection des groupes de tables contre les rollbacks intempestifs, il est possible de positionner des protections au niveau des marques. Deux fonctions répondent à ce besoin.
La fonction emaj_protect_mark_group() pose une protection sur une marque d’un groupe de tables :
SELECT emaj.emaj_protect_mark_group(p_group, p_mark);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_mark(TEXT) : Marque à protéger. Le mot cléEMAJ_LAST_MARKpeut être utilisé comme nom de marque pour indiquer la dernière marque posée.
Données retournées
La fonction retourne l’entier 1 si la marque n’était pas déjà protégée, ou 0 si elle était déjà protégée.
Notes
Une fois une marque protégée, toute tentative de rollback, tracé ou non, est refusée si elle repositionne le groupe de tables à un état antérieur à cette marque protégée.
Une marque d’un groupe de tables de type AUDIT-ONLY ou en état inactif (IDLE) ne peut être protégée.
Lorsqu’une marque est posée, elle n’est pas protégée. Les marques protégées d’un groupe de tables perdent automatiquement leur protection lorsque ce groupe de tables est arrêté.
Prudence
La suppression d’une marque protégée supprime de facto la protection. Elle ne reporte pas la protection sur une marque adjacente.
La fonction emaj_unprotect_mark_group() ôte une protection existante sur une marque d’un groupe de tables :
SELECT emaj.emaj_unprotect_mark_group(p_group, p_mark);
Paramètres en entrée
p_group(TEXT) : Nom du groupe de tables.p_mark(TEXT) : Marque à déprotéger. Le mot cléEMAJ_LAST_MARKpeut être utilisé comme nom de marque pour indiquer la dernière marque posée.
Données retournées
La fonction retourne l’entier 1 si la marque était bien protégée au préalable, ou 0 si elle n’était déjà déjà protégée.
Notes
Une fois la protection d’une marque ôtée, il devient à nouveau possible d’effectuer tous types de rollback sur une marque antérieure.