# Trigger



## krackmoe (21. Jul 2010)

Hi

Ich hab 2 Tabellen.
Ich möchte, dass wenn in einer Tabelle die Spalte "bezahlt" auf Ja geändert wird, das der Wert aus "anzahl" ausgelesen wird und in einer anderen Tabelle dazu addiert wird.
Funktioniert so etwas mit Triggern?


----------



## Michael... (21. Jul 2010)

krackmoe hat gesagt.:


> Ich hab 2 Tabellen.


Exceltabellen, Datenbanktabellen, JTables?


krackmoe hat gesagt.:


> Funktioniert so etwas mit Triggern?


Mit Triggern kann man innerhalb einer Datenbank auf Änderungen in Datentabellen reagieren.
Wenn es das ist, was Du willst, lautet die Antwort: Ja.

Wenn Du uns Dein Vorhaben/ die Umstände genauer erläuterst, kann man Dir u.U. auch noch ein paar Hinweise geben. z.B. ob man für Dein Vorhaben Trigger notwendig/sinnvoll sind, ob Deine Datenbank sowas überhaupt unterstützt...


----------



## krackmoe (21. Jul 2010)

Also es sind 2 MySQL Tabellen.

Ich möchte einfach, dass wenn sich eine Spalte in der einen Tabelle ändert, dass ein Wert aus einer anderen Spalte in der anderen Tabelle dazu addiert wird.
Thats it...


----------



## Michael... (21. Jul 2010)

Wenn das rein auf Datenbankebene ablaufen soll, dann geht's wohl nur über einen Trigger.

Dachte die Eingabe wird in einer Java GUI vorgenommen. Da lässt sich das ein bisschen einfacher gestalten - vor allem wenn man keine Erfahrung mit Triggern hat.


----------



## krackmoe (21. Jul 2010)

Naja.. doch.. ich hab ne .jsp Seite, auf der hab ich nen Link der auf ein servlet verlinkt.. und im Servlet wird dann eben die eine Spalte gesetzt. Und dadurch soll das ganze dann ausgelöst werden.


----------



## Gast2 (21. Jul 2010)

Dann kannst du in dem Servlet auch einen zweiten JDBC Request machen 

Aber mit dem Trigger geht das auch ohne Probleme.


----------



## krackmoe (22. Jul 2010)

```
CREATE TRIGGER testref BEFORE UPDATE ON rechnung
  FOR EACH ROW BEGIN
    UPDATE arzt SET sms = sms + rechnung.anzahl WHERE id = arztId;
  END
```

Das haut nicht ganz hin... wie sag ich ihm in dem UPDATE Statement das er "sms" von der einen Tabelle mit der von rechnung "anzahl" zusammenaddieren soll?


----------



## Michael... (22. Jul 2010)

krackmoe hat gesagt.:


> ```
> CREATE TRIGGER testref BEFORE UPDATE ON rechnung
> FOR EACH ROW BEGIN
> UPDATE arzt SET sms = sms + rechnung.anzahl WHERE id = arztId;
> ...


Mal abgesehen davon, dass das von einem Wertewechsel auf "Ja" abgehängen sollte (davon sehe ich hier überhaupt nichts), schaut es für mich so aus, als ob da ein Designfehler in der Datenstruktur vorliegt und bei richtigem DB Design der Trigger unnötig sein sollte. (Ist aber nur eine Vermutung, da ich die Datenstruktur nicht kenne)


----------



## krackmoe (22. Jul 2010)

Mh.. kann gut sein das es Designfehler gibt... 

Mittlerweile hab ichs darauf geändert und das scheint gut zu funktioniern.. nur jetzt bin ich selber auf nen Designfehler bekommen.. den ich irgendwie angehen muss..


```
CREATE TRIGGER testref AFTER UPDATE ON rechnung
  FOR EACH ROW BEGIN
    UPDATE arzt SET sms = sms + 
    (SELECT anzahl FROM rechnung WHERE id = arzt.id AND bezahlt IS NOT NULL) 
    WHERE id = 1;
  END
```


----------



## Michael... (22. Jul 2010)

Hier mal, wie man so einen Trigger in Oracle schreiben könnte. Sollte in MySQL ähnlich sein (hab diesbzgl. keine Erfahrungen)

```
CREATE OR REPLACE
TRIGGER testTrigger AFTER UPDATE OF observedvalue ON observedtable
FOR EACH ROW
BEGIN
    IF :NEW.observedvalue = 'JA' THEN
      UPDATE observingtable
      SET observingtable.value = observingtable.value + :NEW.value
      WHERE observingtable.id = :NEW.id;
    END IF;
END testTrigger;
```
Wobei die Tabellen so aussehen:

Tabelle ObservingTable
ID, Value

Tabelle ObservedTable
ObservedValue, Value, ID (ID bezieht sich auf die ID aus ObservingTable)


----------

