-
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: [SQL7009] D100 in FILETEST für Operation ungültig. Ursache . . . . : Ursachencode ist 45. Ursachencodes: 40 - In einer globalen temporären Tabelle oder in einer Tabelle in QTEMP kann keine Zeilen- oder Spaltenzugriffssteuerung definiert werden. 45 - Die Tabelle enthält mehrere Spalten, die als Datum oder Zeit definiert sind, die aber nicht dasselbe Datums- oder Zeitformat haben. 47 - Externe Funktion D100 in FILETEST kann nicht als SECURED erstellt werden, da das zugeordnete Programm oder Serviceprogramm nicht als SECURED markiert werden kann. 53 - Eine Materialized Query Table, die beim Zurückspeichern verzögert wurde, kann nicht mit REFRESH TABLE aktualisiert oder mit ALTER TABLE geändert werden. 54 - Das Ziel eines Datenänderungstabellenverweises ist eine verteilte Datei. 55 - Die verteilte Tabelle D100 ist auf dem Requestersystem vorhanden, aber nicht auf dem Zielsystem. 56 - Feldprozedur D100 in FILETEST ist fehlgeschlagen. 57 - Serviceprogramm D100 in FILETEST ist keine globale Variable. 58 - MERGE-Ziel D100 in FILETEST ist eine logische Datei mit mehreren Teildateien und keine SQL-Sicht. 59 - Eine temporale Tabelle für Systemzeitraum konnte nicht zum Einfügen, Aktualisieren, Löschen oder Mischen verwendet werden oder nicht geändert werden, da die Versionssteuerungsbeziehung nicht erstellt wurde. 60 - Anzahl Teildateien für D100 in FILETEST nicht gültig. 63 - MIRROR YES ist für einen INSTEAD OF-Auslöser oder einen als MODE DB2SQL definierten Auslöser nicht zulässig. Fehlerbeseitigung: Je nach Ursachencode eine der folgenden Maßnahmen durchführen: 40 - Die Tabelle in einer anderen Bibliothek erstellen, bevor die Zeilen- oder Spaltenzugriffssteuerung definiert wird. 45 - Die Spalten so ändern, dass sie dasselbe Datums- und Zeitformat haben. 47 - Den Namen eines vorhandenen ILE *PGM oder *SRVPGM mit einem für SQL zugeordneten Speicherbereich angeben, der mit den Attributen der neuen Funktion aktualisiert werden kann. 53 - Sicherstellen, dass die Basisdateien der Materialized Query Table und ihre Teildateien verfügbar sind. Dann die verzögerte Materialized Query Table mit dem Befehl SAVOBJ (Objekt sichern) und RSTOBJ (Objekt zurückspeichern) sichern und zurückspeichern. 54 - Keine verteilte Datei als Datenänderungstabellenverweis angeben. 55 - Eine andere Tabelle angeben, die auf dem Requester- und auf dem Zielsystem vorhanden ist. 56 - Sicherstellen, dass die Feldprozedur gültig ist. 57 - Eine andere Variable angeben oder das der Variablen D100 in FILETEST zugeordnete Serviceprogramm löschen und die globale Variable erneut erstellen. 58 - Eine SQL-Sicht, eine SQL-Tabelle oder eine logische Datei mit nur einer Teildatei angeben. 59 - Sicherstellen, dass die Protokolltabelle vorhanden ist. ALTER TABLE verwenden, um die Versionssteuerung für die temporale Tabelle für Systemzeitraum zu löschen, und anschließend die Versionssteuerung mit ALTER TABLE wieder hinzufügen. 60 - Eine gültige SQL-Tabelle angeben. 63 - 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
-
am einfachsten: RPG Trigger
am besten: Datenkompost aufräumen!
D*B
-
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
-
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
-
was wäre wenn ...
Du für die physische Datei eine SQL View erstellst und dann einen Instead Of Trigger auf die View generierst?
-
... 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.
-
 Zitat von B.Hauser
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
-
 Zitat von BenderD
... 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
-
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.
-
 Zitat von B.Hauser
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
Similar Threads
-
By Lucky662 in forum IBM i Hauptforum
Antworten: 30
Letzter Beitrag: 30-10-19, 07:36
-
By mk in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 24-04-18, 16:34
-
By tarkusch in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 10-08-17, 14:07
-
By lch02 in forum NEWSboard Programmierung
Antworten: 15
Letzter Beitrag: 26-07-15, 06:15
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks