• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 740
  • Last Modified:

How do I create a READ trigger on a Table on the iSeries ?

Hi iSeries buffs !

I have a table - F983051 - with the following columns in it :


as well as a bunch of other columns that are not important.

I have another, custom table, F55983ADT which contains the following information :


Now, I want to create a TRIGGER that inserts data into the F55983ADT table whenever the F983051 is READ.  Obviously the values VRPID, VRVERS, VRENHV would come from the row selected from the F55983ADT table - but the USER, DATE and TIME would be system provided values based on the connection.

I will gift additional points to a very in-depth and conclusive answer.  Thankyou !
1 Solution
Guy Hengel [angelIII / a3]Billing EngineerCommented:
I am note aware of any database that can raise a trigger on READING (SELECT) on a table.
altquarkAuthor Commented:
If I do "ADDPFTRG" - and click F4 on on EVENT - I see "*READ"

It's unclear what you're asking.

You noted that you prompted ADDPFTRG and saw that you could specify *READ as the trigger event. Well... the ADDPFTRG command is one way to add a trigger to a physical file.

However, you're apparently asking how to _create_ the trigger program. The short answer is that you create it the same way you create almost any program -- you enter source statements and then compile it.

Of course, that's perhaps too obvious to be the answer; so, I'd normally assume you meant something a little different. The twist is that read-only trigger programs are currently restricted in that they must be "external triggers". There is no SQL CREATE TRIGGER statement that supports read-only triggers, AFAIK. That means that the ADDPFTRG command is essentially the only route to getting the trigger program associated with a file (or table).

So, are you looking for an answer about how to create programs under i5/OS?


Hi here is an RPGLE program then does the job

H Option(*NODEBUGIO)                                                                            
H DftActGrp(*No)                                                                                
H ActGrp('Trigger')                                                                            
H BNDDIR('MYBNDDIR')                                                                            
FF55983ADT o    e             disk                                                              
 * The following works like an *ENTRY plist:                                                    
D MainLine        pr                  ExtPgm('PGMNAME')                    <<<<<<<<<<<<<<<<<<<<
D   Buf                               likeDS(Parm1)                                            
D   Length                      10I 0                                                          
D MainLine        pi                                                                            
D   Buf                               likeDS(Parm1)                                            
D   Length                      10I 0                                                          
 ** standard specification for all trigger programs                                            
D Parm1           ds                  qualified                                                
D   File                        10A                                         1-10        
D   Library                     10A                                        11-20        
D   Member                      10A                                        21-30        
D   Event                        1A                                        31            
D   Time                         1A                                        32            
D   CommitLock                   1A                                        33            
D                                3A                                        34-36        
D   CCSID                       10I 0                                      37-40        
D   DBRRN                       10I 0                                      41-44        
D                                4A                                        45-48        
D   BOffset                     10I 0                                      49-52        
D   BLen                        10I 0                                      53-56        
D   BNullOffset                 10I 0                                      57-60        
D   BNullLen                    10I 0                                      61-64        
D   AOffset                     10I 0                                      65-68        
D   ALen                        10I 0                                      69-72        
D   ANullOffset                 10I 0                                      73-76        
D   ANullLen                    10I 0                                      77-80        
 **  Constants                                                                          
D BeforeEvent     C                   CONST('2')                                              
D AfterEvent      C                   CONST('1')                                              
D Insert          C                   CONST('1')                                              
D Update          C                   CONST('3')                                              
D Delete          C                   CONST('2')                                              
D Read            C                   CONST('4')                                              
 ** standard work fields                                                                      
D Dtdate          S               D   Inz(*sys)                                                
 *  Grab external definitions for the file                                                
 *  so that we can load the "before" and "After"                                              
 *  buffers into them without manually coding all of                                          
 *  the fields in the file.                                                                    
D ptr_Before      s               *                                                            
D Orig          e ds                  ExtName(F983051   )                                      
D                                     based(ptr_Before)                                        
D                                     qualified                                                
D ptr_After       s               *                                                            
D New           e ds                  ExtName(F983051   )                                      
D                                     based(ptr_After)                                          
D                                     qualified                                                
 * Prototypes for subprocedures in this program                                                
D ReadEvent       Pr                                                                            
D LoopToFree      s               n   Inz(*on)                                                  
D Dtdate          s               d   Inz(*sys)                                                
Dpsds            sds                                                                            
D P#USER                254    263                                                              
   If Buf.event = Read ;                                                                        
      ptr_Before = %addr(Buf) + Buf.BOffset ;                                                  
   else  ;                                                                                      
      return ;                                                                                  
   endif ;                                                                                      
  VRPID   = orig.VRPID  ;                                                            
  VRVERS  = orig.VRVERS ;                                                            
  VRENHV  = orig.VRENHV ;                                                            
  VRUSER  = P#USER ;                                                            
  VRDATE  = Dtdate ;                                                            
  write record ;                                                                

I did not compile the pgm as I do not have the files.

you then use the ADDPFTRG to add this program to the database

where you see <<<<<<<<<<<<< you put the program name here
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now