メニューボタン
サポートチーム便り2023.02.21

ソースファイルの編集履歴を簡易的に記録したい

Question

ソースファイルの編集履歴を記録しておきたいと考えています。

編集内容までは不要で、どの日時にどのユーザーがどのソースファイルを編集したかが記録できれば良いと考えています。

そういった方法はございますか。

Answer

データベース・ジャーナルを設定するという方法もございますが、その場合、ジャーナルを仕掛けたソースファイルしかログを残すことが出来きません。

また、メンバーを編集するとそのログが全レコード分書き出されるため、情報量が多くなってしまいます。

そこで、ここでは別の方法をご案内いたします。

出口点「QIBM_QSU_ALW_EDIT」を使用する方法です。

以下に、IBMの情報がございます。

・How to restrict editing by ADTS utilities SEU, RLU, MRGSRC, EDTSRC and SDA using registered Exit Point QIBM_QSU_ALW_EDIT
https://www.ibm.com/support/pages/how-restrict-editing-adts-utilities-seu-rlu-mrgsrc-edtsrc-and-sda-using-registered-exit-point-qibmqsualwedit

上記では、ソースファイル・メンバーの編集を制限するサンプルソースがありますが、これを応用して、編集履歴をログファイルに書き出すようにします。

この方法ですと、最初に出口プログラムをセットしてしまえば、データベース・ジャーナルのように事前の設定は不要で、どのソースファイルの編集ログもキャッチすることができます。

以下、サンプルソースです。

/* PARAMETERS                                                  */      
/* 1. SRCLIB  CHAR(10)                                         */      
/* 2. SRCFIL  CHAR(10)                                         */      
/* 3. SRCMBR  CHAR(10)                                         */      
/* 4. CONTROL CHAR(1)  OUTPUT                                  */      
             PGM        PARM(&SRCLIB &SRCFIL &SRCMBR &CONTROL) /* TO + 
                          CONTROL SEU EDITING VIA EXIT POINT */        
             DCL        VAR(&SRCLIB) TYPE(*CHAR) LEN(10) /* INPUT +    
                          FROM SEU */                                  
             DCL        VAR(&SRCFIL) TYPE(*CHAR) LEN(10) /* INPUT +    
                          FROM SEU */                                  
             DCL        VAR(&SRCMBR) TYPE(*CHAR) LEN(10) /* INPUT +    
                          FROM SEU */                                  
             DCL        VAR(&CONTROL) TYPE(*CHAR) LEN(1) /* OUTPUT +   
                          FROM USER TO SEU '2'=DISALLOW EDIT  ANY +    
                          OTHERS = ALLOW  EDIT */                      

             DCL        VAR(&USR) TYPE(*CHAR) LEN(10)                
             DCL        VAR(&TXT) TYPE(*CHAR) LEN(50)                
             DCL        VAR(&DATTIW) TYPE(*CHAR) LEN(20)             
             DCL        VAR(&DATTIM) TYPE(*CHAR) LEN(14)             

             ADDLIBLE   LIB(REGLIB)                                  
             MONMSG     MSGID(CPF0000)                               

             RTVUSRPRF USRPRF(*CURRENT) RTNUSRPRF(&USR)              
             RTVJOBA    DATETIME(&DATTIW)                            
             CHGVAR     VAR(&DATTIM) VALUE(&DATTIW)                  

             RTVMBRD    FILE(&SRCLIB/&SRCFIL) MBR(&SRCMBR) TEXT(&TXT)
             MONMSG     MSGID(CPF9815) EXEC(CHGVAR VAR(&TXT) +       
                          VALUE(' ※新規メンバー作成 '))             
             MONMSG     MSGID(CPF0000) EXEC(DO)                      
             RCVMSG     MSGQ(*PGMQ) MSGID(&TXT)                      
             CHGVAR     VAR(&TXT) VALUE(' ※エラー ' || &TXT)    
             ENDDO                                               
             CALL       PGM(QSURPG) PARM(&DATTIM &USR &SRCLIB +  
                          &SRCFIL &SRCMBR &TXT)                  
ENDPGM                                                           

実際に記録されたログは以下のようになります。

スクリーンショット

上記のサンプルソースでは、CLプログラムからRPGプログラムに情報を渡してログファイルに書込みしていますが、SQLを組み込めば、CLプログラム1本で完結できるので、コーディングはよりシンプルに出来るかと思います。

なお、出口プログラムの設定などについては、上記にてご案内しているIBMのサイトをご確認ください。

by かんぴょう木綿さん

あわせて読みたい記事

PAGE TOP