Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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:
ausblenden 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 user profile iconNarses: 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



BeitragVerfasst: Sa 05.01.13 21:34 
Schau mal, ob das funzt:

ausblenden 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 user profile iconNarses: SQL-Tags hinzugefügt

Für diesen Beitrag haben gedankt: Dude566
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Sa 05.01.13 22:03 
Nein funktioniert leider nicht, wirft die gleiche Fehlermeldung. :cry:

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: So 06.01.13 15:27 
Hi,

Zitat:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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:
ausblenden 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:

_________________
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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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



BeitragVerfasst: So 06.01.13 20:15 
Nun der Link zeigt doch, welche Syntax notwendig ist:

ausblenden 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