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
Weitere Produkte im Medialinx Shop »
Versandartikel
Onlineartikel
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...





