Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

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

Posted on 2007-04-10
4
613 Views
Last Modified: 2008-01-09
Hi iSeries buffs !

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

VRPID
VRVERS
VRENHV

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

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

VRPID
VRVERS
VRENHV
VRUSER
VRDATE
VRTIME

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 !
0
Comment
Question by:altquark
4 Comments
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 18884570
I am note aware of any database that can raise a trigger on READING (SELECT) on a table.
0
 
LVL 1

Author Comment

by:altquark
ID: 18884748
If I do "ADDPFTRG" - and click F4 on on EVENT - I see "*READ"
0
 
LVL 27

Expert Comment

by:tliotta
ID: 18886618
altquark:

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?

Tom


0
 
LVL 14

Accepted Solution

by:
daveslater earned 500 total points
ID: 18888201
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                                                              
 **********************************************************************************************
 /free                                                                                          
   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 ;                                                                
  return;                                                                        
                                                                                 
/end-free                                                                        



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
Dave
0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

I guess that all of us know that caching the data usually increase the performance, but I worried if all of us are aware about the risk that caching the data provides and how to minimize this.  That’s the reason why I decided to write this short art…
These days, all we hear about hacktivists took down so and so websites and retrieved thousands of user’s data. One of the techniques to get unauthorized access to database is by performing SQL injection. This article is quite lengthy which gives bas…
Video by: Steve
Using examples as well as descriptions, step through each of the common simple join types, explaining differences in syntax, differences in expected outputs and showing how the queries run along with the actual outputs based upon a simple set of dem…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question