プログラムの中から強制終了させる (監視用の READ トリガーを例に)

CEE4ABN という API を使用すると、現行のアクティベーショングループを強制終了させることができます。

READ トリガー/RPG でトリガー処理」で、READ トリガーという機能は、ファイル/テーブルのオープンであれ、ファイルとしての操作であれ、レコード/カラムが読みとられると必ず発行されることを見ました。

その機能を利用して、監査やセキュリティ目的への使用も考えられます。そのような場合、全件読み取られるのを待っているのではなく、トリガーの方で強制終了させられないか、というのはごく自然な要件として考えられますね。

前回のトリガーに、CEE4ABN を使用してちょっとしたテストをやってみました。


↓がプログラム全文です。あまり解説は必要ありませんね。

     H DFTACTGRP(*no)                                                                               
      *                                                                                             
     D                SDS                                                                           
     D  dsUser               254    263a                                                            
     D  crUser               358    367a                                                            
      *                                                                                             
     D Trg_ABEND       PR                                                                           
     D  TrgBuffer                          LIKEDS(TrgInfo)                                          
     D  TrgBufferLen                 10i 0                                                          
      *                                                                                             
     D Trg_ABEND       PI                                                                           
     D  TrgBuffer                          LIKEDS(TrgInfo)                                          
     D  TrgBufferLen                 10i 0                                                          
      *                                                                                             
     D TrgInfo         DS                  Qualified                                                
     D  File                         10a                                                            
     D  Library                      10a                                                            
     D  Member                       10a                                                            
     D  Event                         1a                                                            
     D  Time                          1a                                                            
     D  CmtLckLvl                     1a                                                            
     D                                3                                                             
     D  CCSID                        10i 0                                                          
     D  RRN                          10i 0                                                          
     D                                4                                                             
     D  BfrRecOfs                    10i 0                                                          
     D  BfrRecLen                    10i 0                                                          
     D  BfrNullOfs                   10i 0                                                          
     D  BfrNullLen                   10i 0                                                          
     D  AftRecOfs                    10i 0                                                          
     D  AftRecLen                    10i 0                                                          
     D  AftNullOfs                   10i 0                                                          
     D  AftNullLen                   10i 0                                                          
      *                                                                                             
     D  BfrRecPtr      S               *                                                            
     D  Original     E DS                  ExtName(QCUSTCDT)                                        
     D                                     Based(BfrRecPtr)                                         
     D                                     Qualified                                                
      *                                                                                             
     D  AftRecPtr      S               *                                                            
     D  New          E DS                  ExtName(QCUSTCDT)                                        
     D                                     Based(AftRecPtr)                                         
     D                                     Qualified                                                
      *                                                                                             
     D   Insert        C                   '1'                                                      
     D   Delete        C                   '2'                                                      
     D   Update        C                   '3'                                                      
     D   Read          C                   '4'                                                      
      *                                                                                             
     D   After         C                   '1'                                                      
     D   Before        C                   '2'                                                      
      *                                                                                             
     D   none          C                   '0'                                                      
     D   change        C                   '1'                                                      
     D   cs            C                   '2'                                                      
     D   all           C                   '3'                                                      
      *                                                                                             
     D ABEND           PR                  extproc('CEE4ABN')                                       
     D  raise_TI                     10i 0 const options(*omit)                                     
     D  cel_rc_mod                   10i 0 const options(*omit)                                     
     D  user_rc                      10i 0 const options(*omit)                                     
      *                                                                                             
      /Free                                                                                         
              BfrRecPtr = %addr(TrgBuffer) + TrgBuffer.BfrRecOfs;                                   
              AftRecPtr = %addr(TrgBuffer) + TrgBuffer.AftRecOfs;                                   
                                                                                                    
              dsply ('USRPRF ' +                                                                    
                      %trim(dsUser) + ' saw: ');                                                    
              dsply ('USRPRF ' +                                                                    
                      %trim(crUser) + ' saw: ');                                                    
              dsply ( %trim(TrgBuffer.Library) + '/' +                                              
                      %trim(TrgBuffer.File) + '(' +                                                 
                      %trim(TrgBuffer.Member) + '):' +                                              
                      'RRN=' +                                                                      
                      %trim(%char(TrgBuffer.RRN)) );                                                
              dsply (%trim(%char(Original.CUSNUM)) + ' ' +                                          
                     Original.LSTNAM +                                                              
                     ' ' + Original.STATE);                                                         
                                                                                                    
              ABEND(*omit: *omit: 0);                                                               
                                                                                                    
              *inLR = *on ;                                                                         
              return ;                                                                              
                                                                                                    
      /End-Free

一行分のメッセージが表示された後、該当のSQL が強制終了されています。

エラーメッセージを見てみると、↓のようなかんじです。

ジョブログには↓のように QRY2293 以前のメッセージが載っています。

メッセージは CEE9901 ですね。

かなり強引なやり方なので、実はもっと穏便な処理の方法があるかもしれません。
それはまた見つけたら、ということで。

[Top Pageに戻る]

Ads by TOK2