Autor |
Beitrag |
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Sa 05.01.13 20:06
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.
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.
Schöne Grüße
Dude566 Moderiert von Narses: Topic aus Off Topic verschoben am Sa 05.01.2013 um 19:57
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
EgonHugeist
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: Sa 05.01.13 21:34
Für diesen Beitrag haben gedankt: Dude566
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Sa 05.01.13 22:03
Nein funktioniert leider nicht, wirft die gleiche Fehlermeldung. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: So 06.01.13 14:53
Niemand einen Vorschlag? Das ist wirklich sehr wichtig. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Quitzlinga
      
Beiträge: 60
Erhaltene Danke: 2
Win XP
Delphi 2007 Prof. Codegear Win32
|
Verfasst: 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
Für diesen Beitrag haben gedankt: Dude566
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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.  Was soll aber diese Fehlermeldung? 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
EgonHugeist
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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: dev.mysql.com/doc/re.../create-trigger.html
Wobei dort glaube ich mit dem SQL Konsolenprogramm gearbeitet wird.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
EgonHugeist
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: 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
|
|
|