Fuchswerk: MYSQL-TRIGGER

CREATE TRIGGER min_gehalt_mitarbeiter  
BEFORE INSERT ON Mitarbeiter  
FOR EACH ROW  
BEGIN  
DECLARE foobar VARCHAR(45)  
IF NEW Mitarbeiter.gehalt < 4 THEN  
SELECT `Das ist die Fehlermeldung` INTO foobar FROM pizza;  
END IF;  
END; //  

Funktioniert nicht, und ich finde den fehler gerade nicht, wäre genial wenn ihr mir hilft

  1. Tach!

    Funktioniert nicht, und ich finde den fehler gerade nicht, wäre genial wenn ihr mir hilft

    Das ist keine Fehlerbeschreibung. Bitte beobachte und beschreibe genauer, was passiert (inklusive der Fehlermeldungen) und was du stattdessen gern hättest.

    dedlfix.

    1. Tach!

      Funktioniert nicht, und ich finde den fehler gerade nicht, wäre genial wenn ihr mir hilft

      Das ist keine Fehlerbeschreibung. Bitte beobachte und beschreibe genauer, was passiert (inklusive der Fehlermeldungen) und was du stattdessen gern hättest.

      dedlfix.

      Ist die Fehlermeldung:

      12:03:00 CREATE TRIGGER min_gehalt_mitarbeiter  BEFORE INSERT ON Mitarbeiter FOR EACH ROW BEGIN DECLARE foobar VARCHAR(45) IF NEW Mitarbeiter.gehalt < 4 THEN SELECT Das ist die Fehlermeldung INTO foobar FROM Mitarbeiter; END IF; END Error Code: 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 'IF NEW Mitarbeiter.gehalt < 4 THEN SELECT Das ist die Fehlermeldung INTO fooba' at line 6 0.000 sec

      Ich möchte gerne das er eine Fehlermeldung ausgibt wenn in Mitarbeiter.Gehalt ein Wert unter dem von mir angegebenen reingeschrieben wird und die Zeile gelöscht wird

      1. Tach!

        Error Code: 1064. You have an error in your SQL syntax; [...] near 'IF NEW Mitarbeiter.gehalt < 4 THEN SELECT Das ist die Fehlermeldung INTO fooba' at line 6 0.000 sec

        Dann schau mal in deinen Code kurz vor dem IF. Fehlt da nicht noch ein Semikolon?

        Ich möchte gerne das er eine Fehlermeldung ausgibt wenn in Mitarbeiter.Gehalt ein Wert unter dem von mir angegebenen reingeschrieben wird und die Zeile gelöscht wird

        Er? Nach meinem Wissensstand hat MySQL keine definierte Möglichkeit, ein Statement ordnungsgemäß abzubrechen[1]. Wenn dein Trigger eine ungünstige Bedingung feststellt, kann er nur selbst einen Fehler provozieren (SELECT von nicht vorhandener Tabelle, Zuweisen von String in INT-Variable), damit er nicht erfolgreich ist, woraufhin das andere Statement nicht ausgeführt wird. Eine Fehlerbehandlung derart in einem Trigger zu implementieren, halte ich jedoch für nicht besonders sauber.

        Weiterhin kann MySQL nichts ausgeben. Es kann nur eine (oder mehrere) Ergebnismenge(n) zurückgeben. Aber ein Trigger arbeitet im Hintergrund auch für Statements, bei denen keine Ergebnismenge vorgesehen ist. Da ist es mit dem Ausgeben besonders schlecht.

        [1] Ab MySQL 5.5 soll es Signals geben, mit denen man sowas tun kann, las ich.

        dedlfix.

        1. ne das hatt auch leider nicht geholfen..

          Ich habs jetzt eh einfach gelassen, weil wie du schon gesagt hast, es sieht nicht sauber aus

          13:20:57 CREATE TRIGGER min_gehalt_mitarbeiter BEFORE INSERT ON Mitarbeiter FOR EACH ROW BEGIN DECLARE foobar INT Error Code: 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 5 0.000 sec

            
          CREATE TRIGGER min_gehalt_mitarbeiter  
          BEFORE INSERT ON Mitarbeiter  
          FOR EACH ROW  
          BEGIN  
          DECLARE foobar INT  
          ;IF NEW Mitarbeiter.gehalt < 0 THEN;  
          SELECT `Das ist die Fehlermeldung` INTO foobar FROM Mitarbeiter;  
          END IF  
          END;
          

          Würde mich aber schon interessieren warum das nicht geht, einfach vom Verständnis her

          1. Würde mich aber schon interessieren warum das nicht geht, einfach vom Verständnis her

            Wo soll die Meldung landen? Du kannst höchstens dem Programm das auf die DB zugreift eine Meldung schicken. Das muss dann drauf vorbereitet sein und die dem Benutzer anzeigen.

            Aber was ich eigentlich sagen wollte, so eine Prüfung gehört nicht in einen Trigger sondern in das Programm. Das sollte die Daten nur dann in die DB schreiben wenn es mit ihnen zufrieden ist.

            1. Würde mich aber schon interessieren warum das nicht geht, einfach vom Verständnis her
              Wo soll die Meldung landen? Du kannst höchstens dem Programm das auf die DB zugreift eine Meldung schicken. Das muss dann drauf vorbereitet sein und die dem Benutzer anzeigen.

              Aber was ich eigentlich sagen wollte, so eine Prüfung gehört nicht in einen Trigger sondern in das Programm. Das sollte die Daten nur dann in die DB schreiben wenn es mit ihnen zufrieden ist.

              Danke euch beiden.

              Ich würde auch das Programm eigentlich zum prüfen benutzen, aber der Prof hatte eindeutig gesagt kein programm drum rumschreiben, deswegen kam ja überhaupt erst diese Idee auf

              1. aber der Prof hatte eindeutig gesagt kein programm drum rumschreiben

                Ach dann war das eine Übungsaufgabe. Das müsste man dazu sagen, denn in dem Fall sollt ihr lernen wie man Trigger nutzen kann. Allerdings sind Übungsaufgaben nicht immer so wirklich prakxisnah :-)

          2. Tach!

            DECLARE foobar INT
            ;IF NEW Mitarbeiter.gehalt < 0 THEN;

            Statements werden mit ; abgeschlossen. Dem DECLARE fehlt eins hintendran - nicht dem IF vorndran.

            dedlfix.

  2. Was solls denn machen?
    Ich kenne MySQL nicht so gut dass ich Syntaxfehler erkennen könnte.
    Aber so wie ich das sehe legst du eine Variable an, in die du den Text schreiben lässt. Danach ist der Trigger zu Ende, ohne dass noch irgendwas mit der Variablen passiert.

  3. Hi,

    IF NEW Mitarbeiter.gehalt < 4 THEN

      
    Da fehlt ein Punkt (.) zwischen NEW und Mitarbeiter. Außerdem macht dein Code nichts und sollte, wenn die Tabelle pizza mehr als einen Eintrag hat, eine Warnung generieren (wenn ich es richtig im Kopf habe). Letzteres, weil man mit SELECT INTO nur eine Ergebniszeile haben darf.  
      
    Bis die Tage,  
    Matti
    
    -- 
    [Webapplikationen in C++ entwickeln](http://tntnet.org/)