symbiont: wie üblich faselst du ungeprüfte Sachen durch die Gegend.
Der BEFORE-Trigger wird erst nach den formalen Prüfungen für den Datentyp ausgelöst. Wenn du dir die Mühe gemacht hättest, das Eingangsbeispiel um einige Debugging-Statements zu erweitern, würdest du das gesehen haben. Bzw. würdest du gesehen haben, dass der Trigger eben nicht aufgerufen wird.
koennte man auch für eine strikte erfuellung eines schnoeden not-null constraints vor dem before-trigger plädieren
Das eine ist eine formale Voraussetzung für den definierten Datentyp, das andere ist ein Constraint. Aber nur für dich schauen wir doch mal, was passiert, wenn man das gleiche mit einem regulär vorhandenen Datentyp probiert:
CREATE OR REPLACE FUNCTION t_test ()
RETURNS TRIGGER AS $$
BEGIN
RAISE NOTICE 'spalte (vorher): %', NEW.spalte;
NEW.spalte := 1;
RAISE NOTICE 'spalte (danach): %', NEW.spalte;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
CREATE TABLE test (spalte INTEGER);
CREATE TRIGGER t_trigger
BEFORE INSERT ON test
FOR EACH ROW
EXECUTE PROCEDURE t_test();
Ein Test mit einem Integer, um die Funktionsfähigkeit zu demonstrieren:
t7=# INSERT INTO test (spalte) VALUES ('5');
NOTICE: spalte (vorher): 5
NOTICE: spalte (danach): 1
INSERT 0 1
t7=# SELECT spalte FROM test;
spalte
--------
1
(1 row)
Und nun der große Praxistext:
t7=# INSERT INTO test (spalte) VALUES ('abc');
ERROR: invalid input syntax for integer: "abc"
Wow, kein Trigger, einfach nur falsche Werte. PostgreSQL lehnt die ungültigen Eingaben von vorneherein ab. Das gleiche passiert auch bei einer Domain.
immerhin definiert man das not null in der domain ja auch als constraint
Das ist der größte Schmarrn, den du (zumindest heute) erzählt hast.
Aber die Details habe ich dir in meinem letzten Posting schon erklärt, ich mag mich ungern wiederholen. Lies die Unterschiede einfach dort mal nach.
gläube mir - du würdest es auch hübscher finden > >
Nein.
Und noch weniger hübsch finde ich es, wenn du meine Meinung bestimmen möchtest.