un petit rappel, il existe depuis quelque temps un mini ETL qui permet de mettre en place un suivi des codes d’audit pour avoir des statistiques et même un visuel dans Navigator for i


Vous voulez créer un datamart sur plusieurs code exemple PW et AF
et avoir un rafraichissement régulier sur la journée
Vous devez créer vos datamarts avant de commencer
En SQL
CALL QSYS2.MANAGE_AUDIT_JOURNAL_DATA_MART(
JOURNAL_ENTRY_TYPE => ‘Votre code’,
DATA_MART_LIBRARY => ‘Votre bib’,
STARTING_TIMESTAMP => CURRENT DATE – 30 DAYS,
ENDING_TIMESTAMP => CURRENT TIMESTAMP,
DATA_MART_ACTION => ‘CREATE’
);
ou dans l’interface Navigator for i
Journal d’audit
Gérer magasin de donnée

Ca va créer des fichiers dans la bibliothèque choisie
AUDIT_JOURNAL_XX nom SQL
AJ_XX en nom systéme
Vous pouvez les interroger par SQL
exemple:
SELECT
ENTRY_TIMESTAMP,
USER_PROFILE_NAME,
OBJECT_NAME
FROM votrebib.AUDIT_JOURNAL_DO
ORDER BY ENTRY_TIMESTAMP DESC;
Nous allons donc créer un fichier de paramétrage qui contiendra les informations de votre datamart code, bibliothèque, type de rafraichissement , et durée de rétention
Création de la table
CREATE TABLE votrebib/PARMART (
CODE_SUIVI CHAR ( 2) NOT NULL WITH DEFAULT,
BIBLIO CHAR ( 10) NOT NULL WITH DEFAULT,
MISEAJOUR CHAR (10) NOT NULL WITH DEFAULT
duree CHAR ( 03) NOT NULL WITH DEFAULT )
Exemple insertion data dans cette table
INSERT INTO GDATA/PARMART VALUES(‘AF’, ‘PLBMART’, ‘*CONTINUE’, ‘030’)
Nous allons créer un programme AUDITREF
PGM PARM(&TIMa &timlim)
/*--------------------------------------------------------*/
/* Ce programme sert de robot pour rafraichir un datamart */
/* exemple toutes les 2 heures, 120 minutes */
/*--------------------------------------------------------*/
dcl &tima *char 3 /* Fréquence de rafraichissement en minutes */
dcl &timlim *char 6 /* Heure d'arret du robot */
/* Fichier de paramétrage des datamart à rafraichir */
DCLF FILE(PARMART)
/* Variable préformatée pour service sql */
DCL VAR(&SQL) TYPE(*CHAR) LEN(512) VALUE('CALL +
QSYS2.MANAGE_AUDIT_JOURNAL_DATA_MART(JOURNA+
L_ENTRY_TYPE => ''XX'', +
DATA_MART_LIBRARY => ''0123456789'', +
STARTING_TIMESTAMP => ''0123456789'', +
ENDING_TIMESTAMP => CURRENT TIMESTAMP, +
DATA_MART_ACTION => ''ADD'')')
dcl &finfichier *lgl
dcl &timsys *char 6 /* Heure système */
dcl &timn *dec 3 /* conversion numérique */
/* Boucle de lecture */
chgvar &timn &tima
boucle:
DOUNTIL COND(&FINFICHIER)
rcvf
MONMSG MSGID(CPF0864) EXEC(LEAVE)
CHGVAR %sst(&SQL 66 2) VALUE(&code_suivi)
CHGVAR %sst(&SQL 94 10) VALUE(&Biblio)
CHGVAR %sst(&SQL 130 10) VALUE(&miseajour)
RUNSQL SQL(&SQL) COMMIT(*NONE)
monmsg sql0000 exec(do)
SNDUSRMSG MSG('Raffraichissement impossible pour,' +
*BCAT &CODE_SUIVI *BCAT 'dans le +
datamart' *BCAT &BIBLIO) MSGTYPE(*INFO)
enddo
enddo
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Raffraichisement des datamarts +
terminé') MSGTYPE(*COMP)
/* on boucle jusqu'a l'heure limite */
rtvsysval qtime &timsys
IF COND(&TIMLIM > &TIMSYS) THEN(do)
dlyjob &timn
GOTO CMDLBL(BOUCLE)
enddo
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Robot +
de Raffraichisement arrêté') MSGTYPE(*COMP)
endpgm
Voici la commande pour démarrer le robot
ici toute les heures jusqu’à 22 h
Vous pouvez le mettre dans un scheduler
SBMJOB CMD(CALL PGM(VOTREBIB/AUDITREF) PARM((‘060’) (‘220000’)))
JOB(AUDITREF)
JOBQ(QSYSNOMAX)
Vous devrez si vous utilisez le mode continue faire le ménage dans le datamart
Exemple
DELETE FROM PLBMART/AJ_AF WHERE ENTRY_TIMESTAMP < current timestamp – 30 days
voici un programme de ménage qui se basera sur la zone durée du fichier
PGM
/*--------------------------------------------------------*/
/* Ce programme sert à épurer les datamarts */
/* qui travaillent *CONTINUE */
/*--------------------------------------------------------*/
/* Fichier de paramétrage des datamart à rafraichir */
DCLF FILE(PARMART)
/* Variable préformatée pour service sql */
DCL VAR(&SQL) TYPE(*CHAR) LEN(512)
dcl &finfichier *lgl
/* Boucle de lecture */
DOUNTIL COND(&FINFICHIER)
rcvf
MONMSG MSGID(CPF0864) EXEC(LEAVE)
CHGVAR VAR(&SQL) VALUE('DELETE FROM' *BCAT &BIBLIO +
*TCAT '/' *TCAT 'AJ_' *TCAT &CODE_SUIVI +
*BCAT 'WHERE ENTRY_TIMESTAMP < current +
timestamp - ' *BCAT &DUREE *BCAT 'days')
SNDUSRMSG MSG(&sql ) MSGTYPE(*INFO)
RUNSQL SQL(&SQL) COMMIT(*NONE)
monmsg sql0000 exec(do)
SNDUSRMSG MSG('épuration impossible pour,' +
*BCAT &CODE_SUIVI *BCAT 'dans le +
datamart' *BCAT &BIBLIO) MSGTYPE(*INFO)
enddo
enddo
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Epuration des datamarts +
terminé') MSGTYPE(*COMP)
endpgm
Pour automatiser, lancer le une fois par semaine par exemple
vous pouvez le mettre dans un scheduler
EPUREAUD SBMJOB CMD(CALL PGM(EPUREAUD) )
JOB(EPUREAUD)
JOBQ(QSYSNOMAX)
Remarque :
Bien sur votre fichier PARMART devra être en ligne pour vos traitements
Vous pouvez également opter pour des informations consolidées à la journée le type est alors *REFRESH et vous n’avez à gérer le durée de rétention.
vous avez un fichier de suivi de vos datamarts, QSYS2.AUDIT_JOURNAL_DATA_MART_INFO
Exemple :
select
* from QSYS2.AUDIT_JOURNAL_DATA_MART_INFO ;

Vous pouvez améliorer cette exemple en ajoutant par exemple la création des datamarts dans les CLLE ou en faisant tout en SQL…
Pour en savoir plus sur les datamarts
https://www.ibm.com/docs/en/i/7.4.0?topic=services-manage-audit-journal-data-mart-procedure

