[NEWSboard IBMi Forum]

Thema: SQL Trigger

Hybrid View

  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    856

    Question SQL Trigger

    Hi zusammen,

    ich möchte einen SQL Trigger erstellen. Soweit kein Problem.
    Aber:
    Tabelle A ist eine DDS Tabelle.
    Tabelle B ist eine SQL Tabelle , alle Felder aus A sind definiert.

    Beim erstellen sagt die i
    PHP-Code:
    Nachricht: [SQL7009D100 in FILETEST für Operation ungültigUrsache  . . . . :  Ursachencode ist 45. Ursachencodes40 In einer globalen temporären Tabelle oder in einer Tabelle in QTEMP kann keine Zeilenoder Spaltenzugriffssteuerung definiert werden45 - Die Tabelle enthält mehrere Spalten, die als Datum oder Zeit definiert sind, die aber nicht dasselbe Datumsoder Zeitformat haben47 Externe Funktion D100 in FILETEST kann nicht als SECURED erstellt werdenda das zugeordnete Programm oder Serviceprogramm nicht als SECURED markiert werden kann53 Eine Materialized Query Table, die beim Zurückspeichern verzögert wurdekann nicht mit REFRESH TABLE aktualisiert oder mit ALTER TABLE geändert werden54 Das Ziel eines Datenänderungstabellenverweises ist eine verteilte Datei55 - Die verteilte Tabelle D100 ist auf dem Requestersystem vorhandenaber nicht auf dem Zielsystem56 Feldprozedur D100 in FILETEST ist fehlgeschlagen57 Serviceprogramm D100 in FILETEST ist keine globale Variable58 MERGE-Ziel D100 in FILETEST ist eine logische Datei mit mehreren Teildateien und keine SQL-Sicht59 Eine temporale Tabelle für Systemzeitraum konnte nicht zum EinfügenAktualisierenLöschen oder Mischen verwendet werden oder nicht geändert werdenda die Versionssteuerungsbeziehung nicht erstellt wurde60 Anzahl Teildateien für D100 in FILETEST nicht gültig63 MIRROR YES ist für einen INSTEAD OF-Auslöser oder einen als MODE DB2SQL definierten Auslöser nicht zulässigFehlerbeseitigung:  Je nach Ursachencode eine der folgenden Maßnahmen durchführen40 - Die Tabelle in einer anderen Bibliothek erstellenbevor die Zeilenoder Spaltenzugriffssteuerung definiert wird45 - Die Spalten so änderndass sie dasselbe Datumsund Zeitformat haben47 Den Namen eines vorhandenen ILE *PGM oder *SRVPGM mit einem für SQL zugeordneten Speicherbereich angebender mit den Attributen der neuen Funktion aktualisiert werden kann53 Sicherstellendass die Basisdateien der Materialized Query Table und ihre Teildateien verfügbar sindDann die verzögerte Materialized Query Table mit dem Befehl SAVOBJ (Objekt sichernund RSTOBJ (Objekt zurückspeichernsichern und zurückspeichern54 Keine verteilte Datei als Datenänderungstabellenverweis angeben55 Eine andere Tabelle angeben, die auf dem Requesterund auf dem Zielsystem vorhanden ist56 Sicherstellendass die Feldprozedur gültig ist57 Eine andere Variable angeben oder das der Variablen D100 in FILETEST zugeordnete Serviceprogramm löschen und die globale Variable erneut erstellen58 Eine SQL-Sichteine SQL-Tabelle oder eine logische Datei mit nur einer Teildatei angeben59 Sicherstellendass die Protokolltabelle vorhanden istALTER TABLE verwendenum die Versionssteuerung für die temporale Tabelle für Systemzeitraum zu löschenund anschließend die Versionssteuerung mit ALTER TABLE wieder hinzufügen60 Eine gültige SQL-Tabelle angeben63 MIRROR NO für den Auslöser angeben
    Lt. Fehlermeldung
    45 - Die Tabelle enthält mehrere Spalten, die als Datum oder Zeit definiert sind, die aber nicht dasselbe Datums- oder Zeitformat haben.


    Meine Recherche hat ergeben das in der Tabelle A Datumsfelder mit *EUR und mit *ISO
    definiert sind. Ich vermute mal das ist das Problem.

    Frage ist jetzt:
    wie kann ich das dem Trigger beibringen ?
    Hier in kurzform
    PHP-Code:
    CREATE OR REPLACE  TRIGGER D100TRG_AI 
     AFTER INSERT ON D100  
     REFERENCING 
    NEW AS N
     
    FOR EACH ROW
      MODE DB2SQL
      
      BEGIN ATOMIC
      
       
      
      insert into d100trgp
      
    (
       
    AUNR      
       AUKDNR    
        
    ...
       )
    values(
       
    n.AUNR 
       n
    .AUKDNR   
       
    ... 
       )  
      
      
    END 

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.396
    am einfachsten: RPG Trigger
    am besten: Datenkompost aufräumen!

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.952
    Es handelt sich sowohl in der DDS-Datei als auch in der SQL Tabelle um ECHTE Datumsfelder nicht irgendwelche numerischen oder alphanumerischen Werte?

    Normalerweise interessiert SQL das Datums-Format nicht, da echte Datumsfelder (im DDS wie in SQL Tabellen) als numerischer Wert (Scaliger No) hinterlegt sind.
    Es könnte nur sein, dass die Datumsfelder mit Format irgendwie alphanumerisch im entsprechenden/hinterlegten Format ankommen oder durch das Format ein Feldüberlauf zustande kommt.
    Es wäre interessant zu wissen, wie die Datums-Felder im Trigger ankommen (einfach mal mit LPRINTF ins Joblog schreiben).

    Was man versuchen könnte:

    1. Das Datums-Format im SET OPTION Statement auf ISO stellen: SET OPTION DatFmt = *ISO.
    2. Sollte das nicht funktionieren, versuch die Datumsfelder (insbesondere die mit europäischem Format) mit TRY_CAST in ein echtes Datum zu konvertieren
    3. Sollte das auch nicht funktionieren, versuche die Daten zunächst in ein alphanumiersches Datum zu konvertieren und danach ebenfalls mit TRY_CAST in ein Echtes Datum
    Birgitta Hauser

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

  4. #4
    Registriert seit
    Jan 2001
    Beiträge
    856
    Hallo,

    Dieter: RPG Trigger könnte ich, will ich aber nicht mehr.
    Datenkompost aufräumen bin ich voll deiner Meinung, aber mit der Altanwendung ist das immer so eine Sache ( Zeit ... )

    Birgitta: Danke für die Tipps. Aber der Trigger lässt sich nicht erstellen. Ein cast auf die Werte geht syntaktisch zwar aber auch damit lässt der Trigger sich nicht erstellen.

    Die Lösung ist leider :
    Alle Datumsfelder müssen identisch definiert sein.
    Also entweder alle mit DATFMT(*EUR) oder mit DATFMT(*ISO).

    Dann kann der Trigger erstellt werden.

    Schade
    Gruß an *ALL
    Michael

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.952
    was wäre wenn ...
    Du für die physische Datei eine SQL View erstellst und dann einen Instead Of Trigger auf die View generierst?
    Birgitta Hauser

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

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.396
    Zitat Zitat von B.Hauser Beitrag anzeigen
    was wäre wenn ...
    Du für die logische Datei eine SQL View erstellst und dann einen Instead Of Trigger auf die View generierst?
    ... die view muss read only sein (join mit Feldern aus mehreren Tables) und verhindert den update auf die vorhandene Table nicht, der dann dem Trigger egal ist.
    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.952
    Zitat Zitat von BenderD Beitrag anzeigen
    ... die view muss read only sein (join mit Feldern aus mehreren Tables) und verhindert den update auf die vorhandene Table nicht, der dann dem Trigger egal ist.
    D*B
    Wo hast Du denn diese Behauptung her? Instead Of Trigger können nur auf Views angelegt werden und mit Instead Of Trigger können gejointe Tabellen upgedated werden. Soweit sind wir uns wohl einig.
    ... nur WARUM sollte ein Instead Of Trigger nicht auf einer ungejointen View implementiert werden können.
    Und auch das IBM-Beispiel ist für eine ungejointe View:
    INSTEAD OF SQL triggers

    ... und auch Mister ChatCPT kann nichts widersprüchliches finden
    Birgitta Hauser

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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.818
    Warum kann zur Laufzeit im Trigger nicht mit Set Option Datfmt=*ISO alles vereinheiticht werden?
    In deinem Create-Auszug vermisse ich die Set Option Anweisung.
    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

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.396
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Wo hast Du denn diese Behauptung her? Instead Of Trigger können nur auf Views angelegt werden und mit Instead Of Trigger können gejointe Tabellen upgedated werden. Soweit sind wir uns wohl einig.
    ... nur WARUM sollte ein Instead Of Trigger nicht auf einer ungejointen View implementiert werden können.
    Und auch das IBM-Beispiel ist für eine ungejointe View:
    INSTEAD OF SQL triggers

    ... und auch Mister ChatCPT kann nichts widersprüchliches finden
    ... ich beziehe meine Info nicht aus ChatGPT, da ich nicht unter Halluzinationen leide und zu meiner Zeit hätten Kunden das auch nicht honoriert - jeder, wie er will und kann. Der join war nur ein Beispiel für read only, es könnten auch abgeleitete Werte oder Aggregatfunktionen sein.
    Wie auch immer, die updates kommen aus einer Altanwendung, die - welche View auch immer - nicht benutzt, sondern die Original Tablelle, die den Trigger nicht feuert.

    Mit kollegialen Grüßen

    Dieter Bender
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.396
    ... die Altanwendung arbeitet mit einer DDS LF und merkt nicht, dass darunter eine SQL erstellte Table liegt. Immer noch nicht elegant aber besser als vorher.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Antworten: 30
    Letzter Beitrag: 30-10-19, 07:36
  2. SQL Trigger
    By mk in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 24-04-18, 16:34
  3. Trigger Sql-updates
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 10-08-17, 14:07
  4. Ermitteln des Schemas im welchen ein SQL-Trigger ausgeführt wird.
    By lch02 in forum NEWSboard Programmierung
    Antworten: 15
    Letzter Beitrag: 26-07-15, 06:15
  5. SQL-Trigger an PF
    By Sebastian85 in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 11-03-15, 08:26

Berechtigungen

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