Announcement

Collapse
No announcement yet.

Trigger wirft SQL Statement fehler

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Trigger wirft SQL Statement fehler

    Hallo Leute,

    ich hoffe ihr könnte mir helfen. Ich möchte einen Trigger, der reagiert, wenn ein Wert in einer bestimmten Spalte einer Tabelle geändert wurde. Wenn der WErt geändert wurde, soll in eine Andere Tabelle Daten aus der geänderten Tabelle geschrieben werden.

    Ich hab bisher das geschrieben, aber da wirft es mit einen Syntax-fehler:

    CREATE TRIGGER trig_geraete_allg_change AFTER UPDATE ON Geraete_allgemein
    FOR EACH ROW
    BEGIN
    IF (OLD.benutzer != NEW.benutzer) THEN
    INSERT INTO Geraete_allgemein_History( Geraet, Benutzer ) VALUES ( NEW.ID, NEW.Benutzer );
    END IF;
    END;

    wenn ich das IF statement weglasse und in insert to die daten von Hand eingebe, funktioniert es den Trigger anzulegen. Ich hab das Insert Into einzeln getestet (Ohne NEW) und es klappt. Ich hab den Trigger ohne den Inhalt von Beginn getestet. Das Funktioniert auch. Er hat also ein Problem mit meiner OLD und NEW Angabe. Woran kann es also liegen, wenn OLD und NEW nicht funktionieren?

    LG
    Asakura

  • #2
    Es fehlen die Doppelpunkte, so müsste es gehen:

    [HIGHLIGHT=plsql]
    IF (:OLD.benutzer != :NEW.benutzer) THEN
    INSERT INTO Geraete_allgemein_History( Geraet, Benutzer ) VALUES ( :NEW.ID, :NEW.Benutzer );
    END IF;
    [/HIGHLIGHT]

    Gruss

    Comment


    • #3
      Was besagt den der Syntax Fehler? Du bekommst ja vermutlich nicht nur ein "Ätsch, so nicht".

      Comment


      • #4
        Hallo,
        Originally posted by Wernfried View Post
        Es fehlen die Doppelpunkte, so müsste es gehen:
        Nein, in der Syntax von MySql sind keine Doppelpunkte vorgesehen!
        Sieht mir eher so aus, als würde der TE über das DELIMITER-Problem stolpern.

        @asakura: Hast du den DELIMITER auf etwas anderes als ; gesetzt? Ansonsten scheitert das Statement, da es nur bis zum ersten ; ausgewertet wird.
        Üblicherweise für die Konsole so:
        [highlight=sql]
        DELIMITER |

        CREATE TRIGGER trig_geraete_allg_change AFTER UPDATE ON Geraete_allgemein
        FOR EACH ROW
        BEGIN
        IF (OLD.benutzer != NEW.benutzer) THEN
        INSERT INTO Geraete_allgemein_History( Geraet, Benutzer ) VALUES ( NEW.ID, NEW.Benutzer );
        END IF;
        END;
        |

        DELIMITER ;
        [/highlight]

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Danke für eure Rückmeldungen.

          Also der Delimiter ist auf standard gesetzt. Also ;
          Ich benutze phpadmin um auf die DB zuzugreifen.

          Die fehlermeldung die kommt sieht so aus:
          SQL-Befehl:

          CREATE TRIGGER `trig_geraete_allg_change` AFTER UPDATE ON `Geraete_allgemein` FOR EACH ROW BEGIN IF `OLD.benutzer` != `NEW.benutzer` THEN INSERT INTO `Geraete_allgemein_History` ( `Geraete_id` , `Benutzer_id` )
          VALUES (
          `NEW.ID` , `NEW.Benutzer`
          );

          MySQL meldet: Dokumentation
          #1064 - 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 '' at line 6

          Das wäre also bei dem Statement das insert Into statement:
          CREATE TRIGGER `trig_geraete_allg_change`
          AFTER UPDATE ON `Geraete_allgemein`
          FOR EACH ROW
          BEGIN
          IF `OLD.benutzer` != `NEW.benutzer` THEN
          INSERT INTO `Geraete_allgemein_History`(`Geraete_id`, `Benutzer_id`) VALUES (`NEW.ID`,`NEW.Benutzer`);
          END IF;
          END;

          PHPMyAdmin: Versionsinformationen: 3.4.10.1deb1
          MySQL server: Server Version: 5.5.22-0ubuntu1
          MySQL-Client-Version: 5.5.22
          Es macht auch keinen Unterschied ob ` drin sind oder nicht. Er hat definitiv mit NEW und OLD ein Problem. Muss ich irgendwas in der DB einstellen? Kanne s was mit der DB Konfiguration zu tun haben?

          Comment


          • #6
            Hallo,
            hast du meinen Post gelesen? Ansonsten zitiere ich mich natürlich gerne:
            Originally posted by Falk Prüfer View Post
            @asakura: Hast du den DELIMITER auf etwas anderes als ; gesetzt? Ansonsten scheitert das Statement, da es nur bis zum ersten ; ausgewertet wird.
            Also einfach den Delimiter - wie in meinem Beispiel - auf ETWAS ANDERES ALS ; setzen und du wirst deinen Trigger anlegen können...

            Gruß Falk

            Anmerkung: Wenn mit "phpadmin" der phpMyAdmin gemeint ist, dann gibt es für das Setzen des DELIMITER das Feld "Begrenzer" unterhalb der SQL-Eingabe.
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Sollte das `NEW.ID` nicht auch eher `NEW`.`ID` sein? Zumindest würde ich das bei einer mehr standardkonformen DB und den üblichen eckigen Klammern erwarten. Wenn die BackTicks denn den eckigen Klammern entsprechen sollen.

              Comment


              • #8
                Hallo,

                Danke für die Rückmeldung. Das mit dem Delimiter hab ich irgendwie falsch verstanden. Dachte ich sollte den stehen lassen, aber genau das war das Problem. Hab das ganze in $$ geändert und schon klappt es. Vielen herzlichen Dank für eure Hilfe. Ihr habt mir echt die Woche gerettet.

                LG
                Asa

                Comment

                Working...
                X