Announcement

Collapse
No announcement yet.

TRIGGER oder PROCEDUR für Adressänderung

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

  • TRIGGER oder PROCEDUR für Adressänderung

    hallo, experten!
    Ich habe ähnliche Frage. In kenne mich schon ein bisschen mit DML, DDL und TCL aus, aber mit trigger/proceduren und funktionen nicht wirklich.
    Und hier ist meine frage.
    z.B. ich habe zwei Tabellen:
    kunde (kID, name, vorname, aktuelle_adresse, ....)
    auftrag (aID, alte_adresse, neue_adresse, staus, datum, kID) <- wo kID - fremdschlüßel

    Feld [status] aus der Tabelle auftrag ist folgendes Datentyp - ENUM('JA', 'NEIN') und symbolisiert den status ERLEDIGT? (JA/NEIN). Default wert ist NEIN
    Die datenbank ist für ein 'umzugsunternehmen' gedacht..obohl das hier ist nur 'Spielerei'...

    Mein Wunsch ist so....
    Jeder gespeicherte Auftrag hat status = 2 (ENUM = 'NEIN'). Nachdem der Umzug beendet wurde, soll man den Status auf 1 (ENUM = 'JA') ändern. Da der auftrag nun beebdet ist und der Kunde jetzt unter neue Adressde (auftrag.neue_adresse) wohnt, sollen die Daten aktualisiert werden. d.H. Werte aus dem Feld ADRESSE aus der Tabelle kunde soll jetzt mit dem Wert aus dem Feld NEUE_ADRESSE der Tabelle auftrag ersetz werden.

    BeispielsDatenuasder Tabellen:
    kunde (1, Mustermann, Max, Datenbankstrasse 1a, .....)
    auftrag (5, Datenbankstrasse 1a, Relationshof 23b, NEIN, 2009-09-20, 1)

    zufuss würde es dann so aussehen:
    PHP Code:
    /* Benutzer ände5r den Status in der Tabelle auftrag Nr. 5 [ERLEDIGT->JA] */
    UPDATE auftrag SET status 1 WHERE aID 
    ERGEBNISS: auftrag (5, Datenbankstrasse 1a, Relationshof 23b, JA, 2009-09-20, 1)

    Danach wird die aktuelle_adresse bearbeitet

    PHP Code:
    /* Ersetzung der aktuellen Adresse aus der Tabelle kunbde mit der neuen Adresse aus der Tabelle auftrag*/
    UPDATE kunde SET aktuelle_adresse = (SELECT neue_adresse FROM auftrag WHERE aID AND kID 1WHERE kID 
    ERGEBNISS: kunde (1, Mustermann, Max, Relationshof 23b, .....)

    Wie gesagt, 'zufuss' funktioniert alles wunderbar, aber wäre es möglich diese 'Aufträge' zu automnatisieren ? Ist das möglich dafüt ein TRIGGER oder PROCEDUR oder so gar FUNKTION zu schreiben ?

    Ich habe schon versucht selbst ein Trigger zu erstellen ,aber irgendwie klappt es nicht

    PHP Code:
    CREATE TRIGGER     update_aktuelle_ardesse
    AFTER UPDATE ON      auftrag
    FOR EACH ROW BEGIN     
    IF NEW.status 1 THEN         
    UPDATE kunde SET OLD
    .aktuelle_adresse =  
    /* ... und hier komm ich nicht weiter    */    
    END IF; 
    END
    P.S. Ich benutze Mysql 5.0.77 unter Ubuntu
    Zuletzt editiert von bugzz; 21.09.2009, 13:07.

  • #2
    Hier ist ein Trigger für deine Zweck. Gleiche kann man auch mit Proceduren machen aber in diesem Fall hat kein Sinn.


    Code:
    DELIMITER &
    
    CREATE TRIGGER update_aktuelle_ardesse AFTER UPDATE ON auftrag
      FOR EACH ROW BEGIN
          IF NEW.status = 1 THEN         
              UPDATE kunde k SET k.aktuelle_adresse = NEW.neue_adresse
                   WHERE k.kID = kID;
          END IF; 
    END;
    &

    Comment


    • #3
      fuzuli001
      Danke sehr, ich habe schon hoffnung verloren, dass mir jemand helfen kann
      Kannst du mir eine sache weiter erklären?

      was is
      PHP Code:
      DELIMITER 
      ich weiss dass es eine art Trennzeichen aber wofür ?!

      UPDATE:
      Okay, habe wegen delimer gegoogelt und verstanden wozu er das ist. Habe auch festgestellt dass dieser trigger durch PHPmyAdmin sich nicht anlegen läßt O.o, aber aus der console geht alles.

      Dabei habe ich etwas anderes gesehen. Die adresse in der Tabelle kunde wird aktualisiert ABER bei allen und nicht nur bei der, wo die ID übereinstimmen =(
      Im momenthabe ich vier Personen in der Tabelle kunde und alle haben eine Adresseaktualisierung bekommen .... =(
      Zuletzt editiert von bugzz; 22.09.2009, 12:02. Reason: UPDATE

      Comment


      • #4
        Hallo,

        die Zeile
        [highlight=sql]
        WHERE k.kID = kID;
        [/highlight]
        muß in
        [highlight=sql]
        WHERE k.kID = NEW.kID;
        [/highlight]
        geändert werden.

        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
          Originally posted by Falk Prüfer View Post
          Hallo,

          die Zeile
          [highlight=sql]
          WHERE k.kID = kID;
          [/highlight]
          muß in
          [highlight=sql]
          WHERE k.kID = NEW.kID;
          [/highlight]
          geändert werden.

          Gruß Falk
          Danke, sowas habe ich mir auch gedacht, aber eher OLD.kID ...
          Warum sollte jetzt NEW.kID verwendet werden ? Weil es um einen Trigger der NACH der aktualisierung ausgeführt wird oder ....aus einem anderen grund ?

          Comment


          • #6
            Hi,

            wenn nur irgenwelche Werte in einem Satz geändert werden und die ID gleichbleibt, dann ist es piepsegal, ob Du OLD oder NEW schreibst, weil die ja dann denselben Wert haben.

            Gruß
            docendo discimus

            Comment

            Working...
            X