danielhalle: MYSQL Trigger mit IF Syntax

Hallo ich sitze gerade an einer kleine Versuchsreihe mit Triggern und Prozeduren in MYSQL 5.1

Ich habe 2 Tabllen die identisch aufgebaut sind

CREATE TABLE tbl\_oshop\_master\_m (
  ID int(5) NOT NULL COMMENT 'SHOPID und LOGO mit der ENDUNG *.gif',
  VALID\_FROM datetime NOT NULL,
  VALID\_TO datetime DEFAULT NULL,
  ID\_OFFERER tinyint(4) NOT NULL,
  ID\_PROGRAM int(10) NOT NULL,
  PARTNER\_CODE char(30) DEFAULT NULL COMMENT 'NUR BEI ZANOX',
  NAME char(255) NOT NULL,
  KEY ID (ID,VALID\_FROM,VALID\_TO,ID\_OFFERER,ID\_PROGRAM,NAME)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Und 2 Trigger die Bei einem Update oder Delete Anspringen sollen

CREATE TRIGGER tbl\_oshop\_master\_update BEFORE UPDATE ON tbl\_oshop\_master\_m
  FOR EACH ROW BEGIN
     INSERT INTO tbl\_oshop\_master\_h VALUES (OLD.ID, OLD.VALID_FROM,NOW()-INTERVAL 1 SECOND, OLD.ID_OFFERER, OLD.ID_PROGRAM, OLD.PARTNER_CODE, OLD.NAME);
  END;

Delimiter ist beachtet :)

Folgendes Problem:
Wenn ich einen Datensatz update denn verschiebt er ihn ordnungsgemäß in die Tabelle. Doch zu beachten ist das Gültigkeitsdatum (VALID_FROM, VALID_TO). Wenn ich den Datensatz update und ein Datum in der Zukunft angebe (NEW.VALID_TO) schreibt er es trotzdem um. Habe dafür auch mehere Trigger gebastelt um das zu versuchen

CREATE TRIGGER tbl\_oshop\_master\_update BEFORE UPDATE ON tbl\_oshop\_master\_m
  FOR EACH ROW BEGIN
 IF (NEW.VALID_TO IS NULL) THEN
     INSERT INTO tbl\_oshop\_master\_h VALUES (OLD.ID, OLD.VALID_FROM,NOW()-INTERVAL 1 SECOND, OLD.ID_OFFERER, OLD.ID_PROGRAM, OLD.PARTNER_CODE, OLD.NAME);
 END IF;
  END;

oder

CREATE TRIGGER tbl\_oshop\_master\_update BEFORE UPDATE ON tbl\_oshop\_master\_m
  FOR EACH ROW BEGIN
 IF (NEW.VALID_TO < NOW()) THEN
     INSERT INTO tbl\_oshop\_master\_h VALUES (OLD.ID, OLD.VALID_FROM,NOW()-INTERVAL 1 SECOND, OLD.ID_OFFERER, OLD.ID_PROGRAM, OLD.PARTNER_CODE, OLD.NAME);
 END IF;
  END;

oder

CREATE TRIGGER tbl\_oshop\_master\_update BEFORE UPDATE ON tbl\_oshop\_master\_m
  FOR EACH ROW BEGIN
 IF (NEW.VALID_TO <> NOW()) THEN
     INSERT INTO tbl\_oshop\_master\_h VALUES (OLD.ID, OLD.VALID_FROM,NOW()-INTERVAL 1 SECOND, OLD.ID_OFFERER, OLD.ID_PROGRAM, OLD.PARTNER_CODE, OLD.NAME);
 END IF;
  END;

Ich hoffe Ihr könnt mir helfen. Die abgelaufenden Datensätze mit Enddatum werden später einfach gelöscht über eine Timerfunktion in MYSQL und der DELETE Trigger verschiebt Sie was auch super klappt. Mir Geht es alleinig Darum irgendwie das Datum abzufangen.

Gruß Daniel

    1. Haben nicht alles verstanden, aber schau mal hier:
      http://dev.mysql.com/doc/refman/5.1/de/index.html
      http://dev.mysql.com/doc/refman/5.1/de/flow-control-constructs.html
      http://dev.mysql.com/doc/refman/5.1/de/using-triggers.html
      (Man beachte die Blockbildung mit BEGIN und END.)

      Vielen Dank,
      aber leider werde ich aus der Doku nicht schlau hab wie oben schon mehere Varianten Probiert leider ohne Erfolg.

      1. Haben nicht alles verstanden, aber schau mal hier:
        http://dev.mysql.com/doc/refman/5.1/de/index.html
        http://dev.mysql.com/doc/refman/5.1/de/flow-control-constructs.html
        http://dev.mysql.com/doc/refman/5.1/de/using-triggers.html
        (Man beachte die Blockbildung mit BEGIN und END.)
        Vielen Dank,
        aber leider werde ich aus der Doku nicht schlau hab wie oben schon mehere Varianten Probiert leider ohne Erfolg.

        Nähere Dich der Problematik schrittweise, also systematisch und benenne genau den Punkt, wenn Du nicht weiterkommst. (Halte Dich kurz. ;)

        1. Das Problem Denke ich ist, das der Trigger in Verbindung mit einer IF Abfrage mit Datum sprich NOW() ein Problem hat.
          Hab aber leider noch keine Antwort unter www.google.de gefunden die mir sagt das Trigger mit IF und Datum nicht funktionieren.

          Grüße

          1. Das Problem Denke ich ist, das der Trigger in Verbindung mit einer IF Abfrage mit Datum sprich NOW() ein Problem hat.

            Welches Problem? Trigger unterstützen IF.

            Hab aber leider noch keine Antwort unter www.google.de gefunden die mir sagt das Trigger mit IF und Datum nicht funktionieren.

            Mit "IF und Datum" nicht funktionieren? Glaubst Du sowas?

            Woran hapert es im Moment genau? Angeblich kannst Du ja ein IF, aber die Datumsfunktion liefert welches falsche (Vergleichs-)Ergebnis genau?

            Wichtig also das "genau".

            1. Das Problem Denke ich ist, das der Trigger in Verbindung mit einer IF Abfrage mit Datum sprich NOW() ein Problem hat.

              Welches Problem? Trigger unterstützen IF.

              Hab aber leider noch keine Antwort unter www.google.de gefunden die mir sagt das Trigger mit IF und Datum nicht funktionieren.

              Mit "IF und Datum" nicht funktionieren? Glaubst Du sowas?

              Woran hapert es im Moment genau? Angeblich kannst Du ja ein IF, aber die Datumsfunktion liefert welches falsche (Vergleichs-)Ergebnis genau?

              Wichtig also das "genau".

              CREATE TRIGGER tbl\_oshop\_master\_update BEFORE UPDATE ON tbl\_oshop\_master\_m
                FOR EACH ROW BEGIN
               IF (NEW.VALID_TO < NOW()) THEN
                   INSERT INTO tbl\_oshop\_master\_h VALUES (OLD.ID, OLD.VALID_FROM,NOW()-INTERVAL 1 SECOND, OLD.ID_OFFERER, OLD.ID_PROGRAM, OLD.PARTNER_CODE, OLD.NAME);
               END IF;
                END;

              Also wenn ein Update ausgeführt wird, soll der Trigger wenn folgende Bedingung erfüllt ist: neue Datum kleiner als das jetzige den Datensatz in die History verschieben.
              Ich bekomme vom Trigger keine Fehlermeldung zurück und er trägt auch keinen Datensatz in die History ein.

              1. Wichtig also das "genau".

                CREATE TRIGGER tbl\_oshop\_master\_update BEFORE UPDATE ON tbl\_oshop\_master\_m
                  FOR EACH ROW BEGIN
                IF (NEW.VALID_TO < NOW()) THEN
                     INSERT INTO tbl\_oshop\_master\_h VALUES (OLD.ID, OLD.VALID_FROM,NOW()-INTERVAL 1 SECOND, OLD.ID_OFFERER, OLD.ID_PROGRAM, OLD.PARTNER_CODE, OLD.NAME);
                END IF;
                  END;

                Welcher Wert hat der Vergleichsausdruck (NEW.VALID_TO < NOW()) ___genau___?

                Mit den Datentypen alles OK? Andere "Experimente" mit Vergleichsausdrücken mit Datumswerten.

                Da musst Du ran, Junge!   ;)

                1. Welcher Wert hat der Vergleichsausdruck (NEW.VALID_TO < NOW()) ___genau___?

                  Datentyp: DATETIME 2007-06-05 18:01:38 ODER NULL

                  UPDATE tbl\_oshop\_discount\_m
                  SET
                   PRICE\_1\_SORT = 'F',
                          VALID\_FROM = NOW()
                  WHERE
                   ID =1

                  oder

                  UPDATE tbl\_oshop\_discount\_m
                  SET
                   PRICE\_1\_SORT = 'F',
                          VALID\_FROM = '2007-06-05 18:01:38'
                  WHERE
                   ID =1

                  Mit den Datentypen alles OK? Andere "Experimente" mit Vergleichsausdrücken mit Datumswerten.

                  Da musst Du ran, Junge!   ;)

                  ich sitze da schon 2 Tage dran :) und bin langsam am verzweifeln

                  1. echo $begrüßung;

                    ich sitze da schon 2 Tage dran :) und bin langsam am verzweifeln

                    Wenn du genauso am Problem vorbeischaust, wie an den Antworten, die du hier bekommst, wundert mich das nicht. Bitte vermute nicht nur, sondern prüfe, ob deine Vermutungen stimmen. Die Vermutung muss dem Gegenteil standhalten können, wenn sie richtig ist. Du vermutest, dass das IF nicht ausgeführt wird. Prüfe, ob in dem Fall ein ELSE ausgeführt wird. Untersuche dann die Werte in der IF-Bedingung. Das ist bei SQL nicht ganz einfach, weil man da nicht einfach so ein echo oder print einfügen kann. Der Eintrag des Wertes in ein Feld wäre z.B. eine Möglichkeit. Allerdings muss man dabei ausschließen, dass nicht irgendwelche Default-Wert-Mechanismen zuschlagen.

                    echo "$verabschiedung $name";

  1. echo $begrüßung;

    Folgendes Problem:
    Wenn ich einen Datensatz update denn verschiebt er ihn ordnungsgemäß in die Tabelle. Doch zu beachten ist das Gültigkeitsdatum (VALID_FROM, VALID_TO). Wenn ich den Datensatz update und ein Datum in der Zukunft angebe (NEW.VALID_TO) schreibt er es trotzdem um. Habe dafür auch mehere Trigger gebastelt um das zu versuchen

    Hier fehlt noch Information, was du genau in welchem Fall erreichen willst, und was bei deinen bisherigen Versuchen das Ergebnis gewesen ist, bzw. wie es sich vom gewünschten Ergebnis unterschied.

    echo "$verabschiedung $name";

    1. Hallo,

      Alle Versuche sind insofern gescheitert das er den Datensatz zwar aktuakisiert hat aber leider nicht den Trigger ausgeführt hat. Es trat keine Fehlermeldung auf.

      Diese Statements können den Trigger auslösen

      UPDATE tbl\_oshop\_discount\_m
      SET
       PRICE\_1\_SORT = 'F',
              VALID\_FROM = NOW()
      WHERE
       ID =1

      UPDATE tbl\_oshop\_discount\_m
      SET
       PRICE\_1\_SORT = 'F',
              VALID\_FROM = NOW(),
              VALID\_TO = 'irgendein datum in der Zukunft'
      WHERE
       ID =1

      1. echo $begrüßung;

        Alle Versuche sind insofern gescheitert das er den Datensatz zwar aktuakisiert hat aber leider nicht den Trigger ausgeführt hat. Es trat keine Fehlermeldung auf.

        Das einzige, was mir momentan dazu einfällt, ist, erstmal das IF wegzulassen und die in der Bedingung verwendeten Ausdrücke in das INSERT-Statement einzufügen. Dann kannst du in der Zieltabelle nachsehen, was für Werte z.B. in NEW.VALID_TO eingetragen waren, denn diese sollten ja dann darin stehen. Auf diese Weise könntest du dem Grund für das Nicht-Ausführen des IF-Zweigs auf die Spur kommen. Vielleicht ist dafür auch mal das Einfügen eines ELSE-Zweigs sinnvoll, denn wenn das IF nicht ausgeführt wird, sollte es das ELSE tun. Wenn beides nicht ausgeführt wird müsste der Fehler woanders zu suchen sein.

        echo "$verabschiedung $name";