Wir möchten verhindern, das sich unsere Kunden überschulden und wir als Bank uns auch. Daher fügen wir an die Stammdatentabelle ein Feld 'dispo' an, welches einen max. Dispo für den Kunden definiert. Nun brauchen wir einen Mechanismus, der bei Eingabe einer Buchung prüft, ob das Konto nicht überzogen wird. Dazu definieren wir einen Trigger.
001 -- 002 -- erst mal die Spalte den Dispo an die Stammdaten anfügen 003 -- 004 ALTER TABLE kunden ADD COLUMN dispo decimal(10,2); 005 006 007 -- 008 -- nun schreiben wir die Triggerfunktion 009 -- 010 CREATE OR REPLACE FUNCTION check_dispo() RETURNS TRIGGER AS $$ 011 DECLARE 012 _current numeric(10,2); 013 _dispo numeric(10,2); 014 BEGIN 015 IF NEW.typ = 'Z' THEN 016 return NEW; 017 END IF; 018 019 SELECT INTO _current sum(case when typ='Z' then wert else wert*-1 end) 020 from buchungen 021 where kontonr = NEW.kontonr; 022 SELECT INTO _dispo dispo * -1 from kunden where kontonr = NEW.kontonr; 023 024 IF _dispo > (_current - NEW.wert) THEN 025 RAISE EXCEPTION 'Dispo überschritten, Buchung ignoriert'; 026 END IF; 027 028 RETURN NEW; 029 END; 030 $$ LANGUAGE plpgsql; 031 032 033 -- 034 -- diese definierte Funktion wird nun unser Trigger 035 -- 036 CREATE TRIGGER dispocheck BEFORE INSERT OR UPDATE ON buchungen 037 FOR EACH ROW EXECUTE PROCEDURE check_dispo();Download trigger.sql