Open Source im professionellen Einsatz

Funktioniert der Trigger?

Jetzt kann sich der Entwickler daran machen, die eben gesetzten Trigger und Stored Procedures zu testen. Zuerst verschafft er sich Gewissheit über die Ausgangslage des Shopsystems. Auf »SELECT min_lagermenge, min_bestellmenge FROM artikel WHERE id = 1;« antwortet es mit

min_lagermenge | min_bestellmenge
----------------+------------------
 10 | 20

Der Artikel mit der Nummer 1 sollte also mindestens zehnmal vorrätig sein. »SELECT bestand FROM lager WHERE artikel_id = 1;« dagegen zeigt den Ist-Stand:

bestand
---------
 11

Und »SELECT menge FROM zu_bestellen WHERE artikel_id = 1;« stellt klar, dass keine Nachbestellung läuft:

menge
-------
(0 rows)

Nun möge ein fiktiver Kunde auftauchen, der zwei Stück von Artikel 1 bestellt:

shop=# INSERT INTO bestellung (kunde, datum, artikel, menge) VALUES (1, current_date, 1, 2);

Dank des in Listing 1 definierten Triggers verringert sich gleichzeitig der Lagerbestand um zwei Stück. Dies löst wiederum den Trigger »trg_bestellen« der Tabelle »lager« (Listing 2) aus, da die Mindestlagermenge jetzt unterschritten ist und es keinen Eintrag in der »zu_bestellen« -Tabelle für diesen Artikel gibt. Mit »SELECT menge FROM zu_bestellen WHERE artikel_id = 1;« und der Antwort

menge
-------
 20
(1 row)

ist bewiesen, dass das Lager gerade eine Nachbestellung angefordert hat.

Writeable Common Table Expression

Die Tabelle »zu_bestellen« könnte nun regelmäßig ein Mitarbeiter oder ein Cronjob per Datenbankclient auslesen:

WITH nachbestellt AS (
 DELETE FROM zu_bestellen RETURNING *
) SELECT artikel_id, menge FROM nachbestellt;

Diesen Befehl genauer zu studieren lohnt sich, denn er nutzt das wenig bekannte Feature "Writeable Common Table Expression" (WCTE): Der erste Teil »WITH Tabellenname AS ()« erzeugt die dort benannte Zwischentabelle, die später referenzierbar ist. Der konkrete Fall löscht Einträge und bildet daraus die Tabelle »nachbestellt« , aus der im zweiten Teil alle Einträge selektieren werden. Auch wenn in solch einer WCTE zwei oder mehr Zwischenschritte folgen – die Datenbank führt die WCTE atomar aus, also in einem einzigen Schritt und damit innerhalb einer Transaktion.

Der Client darf diese Tabelle wie erwähnt auslesen, zum Beispiel eine E-Mail mit der Nachbestellung verschicken und dann die Löschung »COMMIT« -ten. Alternativ könnte ein Trigger auf der »zu_bestellen« -Tabelle die Nachbestellung anzetteln. Das würde allerdings bei jeder Kundenorder passieren und nicht gebündelt wie beim Ansatz per Cronjob.

Die Beispiele bisher haben ihre Trigger mit jeweils einer eigenen Funktion in der Sprache PL/pgSQL implementiert. Wenn es sinnvoll erscheint, kann der Programmierer beliebig viele Trigger pro Tabelle definieren, diese starten in alphabetischer Reihenfolge und sind zudem kaskadierbar.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook