[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Thema: SQL-Trigger

  1. #1
    Registriert seit
    Jul 2003
    Beiträge
    338

    Cool SQL-Trigger

    Ein SQL-Trigger kann z.B. ausgelöst werden nach Änderunge eines bestimten Feldes in einer Datei.

    Beispiel: create Trigger lib/name after update of Feld1 on lib/Datei

    Jetzt würde ich gerne den Trigger auslösen, wenn eines von 3 Feldern geändert wurde. Kann man mit OR arbeiten ? oder ähnliches, oder ist für jedes Feld ein eigener Trigger zu erstellen ?


    Ludger

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo Ludger,

    versuch mal folgendes:
    PHP-Code:
    CREATE TRIGGER MySchema/MyTable 
           AFTER UPDATE OF Fld1
    Fld2Fld3 on MyTable 
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Jul 2003
    Beiträge
    338

    Cool

    Hallo Birgitta, da klappt ja wunderbar.

    Ich habe aber noch ein anderes Problem. Ich habe versucht, aus Deiner Beschreibung: "Welches Programm aktivierte meinen Trigger ?" das auslösende Programm zu ermitteln.
    Dabei wird mir aber folgende Fehlermeldung angezeigt:

    PHP-Code:
     Routine TRIWERCL in MUHSTANPGM mit angegebenen Parametern nicht gefunden
     
    SQL-Auslöser TR_LAGBES2 in ANCRAPGM ist mit SQLCODE -440 SQLSTATE 42884   
       fehlgeschlagen
    .                                                         
     
    Fehler im Auslöserprogramm.                                               
     
    Fehler im Auslöserprogramm
    Ich habe folgendes CL erstellt und compiliert:
    PHP-Code:
     /*****************************************************************/         
     /*   T R I W E R C L    /  compiliert nach MUHSTANPGM             */         
     /*   welches Programm löste das Trigger-Programm aus ?           */         
     /*    Author  . . . . . . . .  : B.Hauser                                      */         
     /*****************************************************************/         
                                                                                 
                  
    PGM        PARM(&CALLER           +                            
                                  &
    CALLED)                                       
        
    /* ---------------------------------------------------------------*/     
                  
    DCL        VAR(&CALLERTYPE(*CHARLEN(10)                    
                  
    DCL        VAR(&CALLEDTYPE(*CHARLEN(10)                    
                                                                                 
                  
    DCL        VAR(&MSGKEY)   TYPE(*CHARLEN(4)                   
                  
    DCL        VAR(&SENDER)   TYPE(*CHARLEN(80)                  
        
    /* ---------------------------------------------------------------*/     
                  
    SNDPGMMSG  MSG('TEST')                                  +      
                             
    TOPGMQ(*PRV (&CALLED))                       +      
                             
    MSGTYPE(*RQS)                                    +      
                             
    KEYVAR(&MSGKEY)                                     
                                                                           
                 
    RCVMSG     PGMQ(*PRV (&CALLED))                         +   
                            
    MSGKEY(&MSGKEY)                                    +   
                            
    SENDER(&SENDER)                                  
                                                                             
                 
    CHGVAR     VAR(&CALLERVALUE(%SST(&SENDER 56 10))          
       
    ENDE:     ENDPGM 

    Folgende Stored-Procedure habe ich erstellt und mit RUNSQLSTM erstellt
    PHP-Code:
                                                              
     CREATE PROCEDURE MUHSTANPGM
    /TRIWERPC (                  
                  
    OUT ParmCaller CHAR(10) ,                  
                  
    IN  ParmCalled CHAR(10) )                  
                  
    LANGUAGE CL                                
                  SPECIFIC MUHSTANPGM
    /TRIWERPC               
                  NOT DETERMINISTIC                          
                  NO SQL                                     
                  CALLED ON NULL INPUT                       
                  EXTERNAL NAME 
    'MUHSTANPGM/TRIWERCL'        
                  
    PARAMETER STYLE SQL 
    Der Trigger sieht folgendermassen aus:

    PHP-Code:
                                                             
     CREATE TRIGGER ancrapgm
    /tr_lagbes2                      
        AFTER UPDATE  OF LAPROS
    LALORT ON  lagbespf         
        REFERENCING 
    NEW ROW AS neu                           
                    OLD ROW 
    AS alt                           
        
    FOR EACH ROW MODE DB2ROW                             
                                                             
     BEGIN                                                   
        
    DECLARE  I_pgm  CHAR(10)  default 'QDBUDR';          
        DECLARE  
    O_pgm  CHAR(10)  default ' ';                            
        DECLARE  
    A_QUAL CHAR(6);                                          
        DECLARE  
    B_QUAL CHAR(6);                                          
        
    SET      A_QUAL    =  substring(alt.laarti16);                
        
    SET      B_QUAL    =  substring(neu.laarti16);                
                                                                        
      
    call MUHSTANPGM/TRIWERPC(O_pgmI_pgm);                           
                                                                        
      
    INSERT into ancradta/LATRIGpf                                     
         
    (LWFIRM,                                                       
          
    LWstkn,                                                       
          
    LWprgr,                                                       
          
    LWvkg1,                                                       
          
    LWpros,                                                       
          
    LWlort,                                                       
          
    LWnmen,                                                       
          
    LWvgre12,                                                     
          
    LWqual,                                                       
          
    LWvere,                                                       
          
    LWDESS,                                                       
          
    LWPROGRA)                      
           
    values(                    
            
    neu.LaFIRM,               
            
    neu.Lastkn,               
            
    neu.Laprgr,               
            
    neu.Lavkg1,               
            
    neu.Lapros,               
            
    neu.Lalort,               
            
    neu.Lanmen,               
            
    neu.Lavgre12,             
            
    B_qual,                   
            
    neu.Lavere,               
            
    neu.LaDESS,               
            
    O_PGM) ;          
                                   
     
    end 
    Sobald ich die Anweisung: CALL MUHSTANPGM/TRIWERPC weglasse, funktioniert es, allerdings natürlich ohne die Ermittlung des Programm-Namens.


    ( TRIWERCL ist als Objekt in MUHSTANPGM vorhanden )



    Was mache ich falsch ?

    Ludger

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    PARAMETER STYLE SQL

    ist wohl das Problem, da mehr als 2 Paramter an das CLP übergeben werden. Nimm die richtige Parameterdefinition.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Jul 2003
    Beiträge
    338

    Red face

    Zitat Zitat von Fuerchau
    PARAMETER STYLE SQL

    ist wohl das Problem, da mehr als 2 Paramter an das CLP übergeben werden. Nimm die richtige Parameterdefinition.
    Hallo Baldur,

    ich habe die Stored Procedure geändert auf
    PARAMETR STYLE GENERAL

    Jetzt klappt es, ohne Abbruch (ich weiss aber nicht warum)

    @Birgitta
    Als Programm-Name wird bei DFU ermittelt: QDZXDBI (unabhängig, ob der Satz neu ist, geändert wird oder gelöscht wird. -> unterschiedliche Trigger)

    In einem RPG-Programm mit embedded-SQL wird als programm-Name ermittelt bei update: QSQRUN3 .

    Kann bei RPG evtl. auch der RPG-Name ermittelt werden ?
    Gibt es weiterhin eine Möglchkeit, zu ermitteln, welcher Benutzer die Daten-Änderung vorgenommen hat ?

    mfg. Ludger

  6. #6
    Registriert seit
    Aug 2004
    Beiträge
    923
    Hello,

    Da gibts ja noch zig andere Möglichkeiten, wie Sätze reinkommen/verändert werden.
    Als da wäre CPYF , RESTORE usw. usf.
    Und die Java-Fraktion hatte damals einen gemeinsamen Account, da war eine Unterscheidugn auch schlecht.
    Ich hatte früher auch mal das Problem, je nach Verursacher im Trigger entscheiden zu müssen...
    Wenn ich mich richtig entsinne, hat es nie vollständig geklappt. Irgendwo ist immer der Wurm drin bzw. findet ein Anwender/Programm einen neuen unbekannten Weg.

    Letzten Endes ist eine organisatorische Lösung aus meiner Sicht besser als diese Triggerei für Alle..

    kuempi

  7. #7
    Registriert seit
    Jul 2003
    Beiträge
    338
    Zitat Zitat von kuempi von stein
    Hello,

    Da gibts ja noch zig andere Möglichkeiten, wie Sätze reinkommen/verändert werden.
    Als da wäre CPYF , RESTORE usw. usf.
    Und die Java-Fraktion hatte damals einen gemeinsamen Account, da war eine Unterscheidugn auch schlecht.
    Ich hatte früher auch mal das Problem, je nach Verursacher im Trigger entscheiden zu müssen...
    Wenn ich mich richtig entsinne, hat es nie vollständig geklappt. Irgendwo ist immer der Wurm drin bzw. findet ein Anwender/Programm einen neuen unbekannten Weg.

    Letzten Endes ist eine organisatorische Lösung aus meiner Sicht besser als diese Triggerei für Alle..

    kuempi
    hallo kuempi,

    ich arbeite eigentlich auch lieber mit durch von Anwendern ausgelösten Programme, die Protokolle schreiben. Dann hat man es wenigstens in der Hand, was passieren soll.

    In diesem Falle lässt es sich aber nicht umgehen, Programme durch Datenbank-Aktivitäten anzustossen, da im Laufe von Jahren viele selbstgestrickte Progrämmchen entstanden sind. Da erscheint es als ersten Schritt zunächst mal einfacher: Unstimmigkeiten in den Daten über diesen Weg (Trigger) zu erkennen.

    ( es handelt sich um die am häufigsten und vielseitigsten genutzte Datei beim
    Anwender )

    mfg Ludger

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von loeweadolf
    Kann bei RPG evtl. auch der RPG-Name ermittelt werden ?
    Das ist relativ einfach. Mit dem CL-Programm kannst Du Dich durch den kompletten Call-Stack hangeln. Einfach immer das ermittelte rufende Programm als aufgerufenes Programm übergeben. Das wird solange ausgeführt, bis Du den ersten Eintrag findest, der nicht mit Q anfängt. (Wenn Deine Programm-Namen allerdings mit Q anfangen hast Du verloren!)

    Falls Du auch noch Modul und Prozedur ermitteln willst, musst Du die entsprechenden Informationen im SNDPGMMSG bei TOMSGQ angeben. Das rufende Modul wird im Sender ab Stelle 355 ausgegeben und die rufende Prozedur ab Stelle 375.

    Alternativ kannst Du natürlich auch den CALL-Stack über das API QWVRCSTK (Retrieve Call Stack).

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wenn du eine Datei journalisierst, stehen Programm, User und Zeitmarke im Journal.
    Ansonsten per RPG in der SDS den *USER-Eintrag oder per RTVJOBA den User abfragen.

    Und was den Parameterstyle angeht:
    Bei SQL werden noch NULL-Flag-Zeiger und eine Status-Area übergeben, bei General eben nur die Parameter.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Jul 2003
    Beiträge
    338

    Question

    Das CL habe ich erweitert um die Ermitteln des Users. Die Stored Procedure habe ich ergänzt um einen weiteren OUT-Parameter für ds obige CL für den User. Das klappt wohl.


    Zitat Zitat von Birgitta
    Das ist relativ einfach. Mit dem CL-Programm kannst Du Dich durch den kompletten Call-Stack hangeln. Einfach immer das ermittelte rufende Programm als aufgerufenes Programm übergeben. Das wird solange ausgeführt, bis Du den ersten Eintrag findest, der nicht mit Q anfängt. (Wenn Deine Programm-Namen allerdings mit Q anfangen hast Du verloren!)
    Ich habe das so verstannden, dass ich eine Schleife in das CL einbauen kann, die solange durchlaufen wird, bis der ermittelte Aufruf-Name nicht mehr mit -Q- anfängt.

    Den Wert aus &CALLER bringe ich dann nach &CALLED und wiederhole das SNDPGMMSG.

    Bei der ersten Wiederholung des SNDPGMMSG kommt allerdings folgende Fehlermeldung:

    PHP-Code:
     Job 060880/LUMU/LUMU_A im Subsystem QINTER in QSYS am 03.01.06 um 01:52:11 g   
     Nachrichtenwarteschlange LUDGER ist anderem Job zugeordnet
    .                      
     
    CPF2469 von TRIWERCL bei 2600 empfangen. (C D I R)                             
                                                                                    
                           
    Weitere Nachrichteninformationen                      
                                                                                 
    Nachrichten
    -ID . . . . :   CPA0701       Bewertung  . . . . . . :   99       
    Nachrichtenart 
    . . . . :   Anfrage                                           
    Sendedatum 
    . . . . . . :   03.01.06      Sendezeit  . . . . . . :   01:53:26 
                                                                                 
    Nachricht 
    . . . :   CPF2469 von TRIWERCL bei 2600 empfangen. (C D I R)       
    Ursache . . . . . : Das CL-Programm TRIWERCL in Bibliothek MUHSTANPGM hat    
      einen Fehler bei Anweisung 2600 erkannt
    Der Nachrichtentext für CPF2469   
      ist
    Fehler aufgetreten beim Senden der Nachricht .. 

    Was könnte die Ursache sein ?

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Du kannst deinen Triger auch ganz normal debuggen (mittels STRDBG und Umwandlungsoption) um den Inhalt deiner Variablen anzusehen.
    Irgendwie kommst du auf die MSGQ LUDGER und nicht auf die Job-MSGQ !
    Ggf. zerstörst du die die Variablen mit dem User-Namen ?!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Jul 2003
    Beiträge
    338

    Thumbs down

    Es wird jetzt die JOB-MSGQ verwendet.


    Da immer noch derselbe Fehler kam, habe ich die Schleife
    aus dem CL rausgenommen und als Schleife jeweils ein 2. CL
    aufgerufen, um den Namen zu ermittel, jeweils mit Übergabe
    des zuluetzt ermitteln "CALLER"
    Immer derselbe Fehler, auch ein DUMP bringt mich nicht weiter.
    Vielleicht fehlen mir auch die kenntnisse bzgl. Nachrichtenschlangen.

    Da ich mich jetzt anderen Dingen widmen muss, gebe ich zunächst mal auf.

    mfg. Ludger

Similar Threads

  1. SQL Trigger
    By Jenne in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 19-01-07, 09:24
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL Trigger
    By bigmoon in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-09-06, 18:26
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Erstellen Trigger über SQL / Read Funktion
    By GHoffmann in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 07-07-05, 09:18

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •