Entwickler-Ecke
Datenbanken - MySQL Trigger Problem
Dude566 - Sa 05.01.13 20:06
Titel: MySQL Trigger Problem
Hallo Community,
ich muss mich mal wieder an euch wenden.
Für ein Projekt arbeite ich mit einer MySQL Datenbank (XAMPP), unter anderem soll ich auch einen Trigger entwerfen.
Ich habe jetzt einen entworfen, aber beim Eintragen des Triggers wird mir immer folgende Fehlermeldung an den Kopf geschmissen und ich weiß einfach nicht, was an meinem Code falsch sein soll:
Zitat: |
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF; END; // DELIMITER' at line 9 |
Hier mein SQL-Code:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| DELIMITER // CREATE TRIGGER ausmustern AFTER UPDATE ON Fahrrad FOR EACH ROW BEGIN
IF NEW.Status = 0 THEN BEGIN DECLARE anzahl INTEGER default 0; SELECT count(*)+1 FROM Ausgemustert INTO anzahl; INSERT INTO Ausgemustert(ANr, Fahrrad, Art, Datum, Erloes) VALUES(anzahl, NEW.FNr, 'Unbekannt', CURDATE(), 0.00); END IF;
END; // DELIMITER; |
Wenn ich Zeile 9 einfach mal heraus lösche, um zu sehen ob der Fehler beim INSERT liegt, wird die vorherige Zeile bemängelt. :nixweiss:
Hoffe ihr könnt mir sagen, welche(n) Fehler ich gemacht habe und wie ich sie/ihn vermeiden kann.
Bitte reißt mir nicht den Kopf ab, dies ist mein erster Trigger. :D
Schöne Grüße
Dude566
Moderiert von
Narses: Topic aus Off Topic verschoben am Sa 05.01.2013 um 19:57
EgonHugeist - Sa 05.01.13 21:34
Schau mal, ob das funzt:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| DELIMITER // CREATE TRIGGER ausmustern AFTER UPDATE ON Fahrrad FOR EACH ROW BEGIN
IF NEW.Status = 0 THEN BEGIN DECLARE anzahl INTEGER default 0; SELECT count(*)+1 FROM Ausgemustert INTO anzahl; INSERT INTO Ausgemustert(ANr, Fahrrad, Art, Datum, Erloes) VALUES(anzahl, NEW.FNr, 'Unbekannt', CURDATE(), 0.00); END IF;
END; // DELIMITER ; |
Moderiert von
Narses: SQL-Tags hinzugefügt
Dude566 - Sa 05.01.13 22:03
Nein funktioniert leider nicht, wirft die gleiche Fehlermeldung. :cry:
Dude566 - So 06.01.13 14:53
Niemand einen Vorschlag? Das ist wirklich sehr wichtig. :(
Quitzlinga - So 06.01.13 15:27
Hi,
Zitat: |
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| DELIMITER // CREATE TRIGGER ausmustern AFTER UPDATE ON Fahrrad FOR EACH ROW BEGIN
IF NEW.Status = 0 THEN
BEGIN DECLARE anzahl INTEGER default 0; SELECT count(*)+1 FROM Ausgemustert INTO anzahl; INSERT INTO Ausgemustert(ANr, Fahrrad, Art, Datum, Erloes) VALUES(anzahl, NEW.FNr, 'Unbekannt', CURDATE(), 0.00); END IF; | |
Nimm mal das BEGIN raus. Nach den von mir nachgesehenen Triggerbeispielen kommt das in MySQL-Triggern nicht vor.
MfG
Quitzlinga
Dude566 - So 06.01.13 16:42
Das bringt leider auch nichts, es kommt hingegen eine andere Fehlermeldung:
Zitat: |
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE anzahl INTEGER default 0; SELECT count(*)+1 FROM Ausgemustert INTO an' at line 5 |
Hab jetzt nochmal die DB zurückgesetzt und mein SQL-Log importiert.
Dann nochmal den Trigger wie folgt abgeändert:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| DELIMITER // CREATE TRIGGER ausmustern AFTER UPDATE ON Fahrrad FOR EACH ROW BEGIN DECLARE anzahl INTEGER default 0; SELECT count(*)+1 FROM Ausgemustert INTO anzahl; IF NEW.Status = 0 THEN INSERT INTO Ausgemustert(ANr, Fahrrad, Art, Datum, Erloes) VALUES(anzahl, NEW.FNr, 'Unbekannt', CURDATE(), 0.00); END IF; END; // DELIMITER; |
Fehlermeldung kommt immer noch folgende:
Zitat: |
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1 |
Trotzdem wird der Trigger nun angelegt und macht auch das was er soll. :dance2: Was soll aber diese Fehlermeldung? :gruebel:
EgonHugeist - So 06.01.13 18:30
Mal dumm gefragt:
Wie fühst du das Script eigentlich aus? Mit dem WorkBench o.ä.?
Der DELIMITER an sich (hau mich, wenn ich mich irre) gehöhrt nicht zu den von MySQL verstandenen Keywords, wird jedoch von Script-verabeitenden Parsern benutzt, um einzelne Ausführbare statements, welche nicht mit dem übliche Terminator ';' enden, herauszulösen und im Ganzen auszuführen.
Soll heißen, wenn du den Trigger über deine eigene App mit 'nem Execute erzeugst, kannst du den Delimiter auch weg lassen.
Gruß, Michael
Dude566 - So 06.01.13 19:38
Ich dachte der Delimiter wäre MySQL bekannt, eingetragen werden die Befehle von mir via phpMyAdmin.
Wird ja auch hier in Code Beispielen genutzt:
http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html
Wobei dort glaube ich mit dem SQL Konsolenprogramm gearbeitet wird.
EgonHugeist - So 06.01.13 20:15
Nun der Link zeigt doch, welche Syntax notwendig ist:
SQL-Anweisung
1: 2: 3: 4:
| CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt |
Und ja du hast Recht, das Bsp. bezieht sich auf das Script, welches ebenfalls geparst werden muß. Der DELIMITER fungiert als alternatives Zeichen für den Parser, um das Ende eines Statements zu erkennen, indem sich der ';'-Terminator Mehrfach befindet.
Laß mal den DELIMITER weg, wenn du keine Script-Ausführende Software verwendest.
Gruß Michael, ZeosDevTeam
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!