2017-03-01 6 views
1

Ich versuche eine Ausnahme auszulösen, wenn eine schreibgeschützte Spalte geändert wird. Dafür benutze ich einen Trigger vor dem Update, aber ich bekomme Syntaxfehler.Ausnahme bei Aktualisierung der schreibgeschützten Spalte mit PostgreSQL auslösen

DROP TRIGGER IF EXISTS check_update_guid_line ON line; 
CREATE TRIGGER check_update_guid_line 
    BEFORE UPDATE ON line FOR EACH ROW 
    WHEN (OLD.guid IS DISTINCT FROM NEW.guid) THEN 
     RAISE EXCEPTION 'you cant modify the guid of a line'); 

ERROR: syntax error at or near "THEN" LINE 29: ...OLD.guid IS DISTINCT FROM NEW.guid) THEN

Ich glaube, ich eine Prozedur machen könnte den Code eine Reihe von Linien erstrecken, aber ich würde dieser Code wissen, warum sowieso nicht funktionieren.

+0

Sie können nicht den Trigger-Code inline mit der Trigger-Anweisung erstellen setzen. Sie müssen eine Funktion erstellen, auf die Sie verweisen können. Details und Beispiele finden Sie im Handbuch: https://www.postgresql.org/docs/current/static/sql-createtrigger.html#SQL-CREATETRIGGER-EXAMPLES und https://www.postgresql.org/docs/current /static/plpgsql-trigger.html –

Antwort

1

spaltete es in zwei Schritten, wie hier:

CREATE OR REPLACE FUNCTION fn_1() 
RETURNS trigger 
LANGUAGE plpgsql 
COST 1 
AS $function$ 
BEGIN 
    IF NEW.id is distinct from OLD.id then 
    RAISE EXCEPTION '%','whatever it is'; 
    END IF; 
    return NEW; 
END; 
$function$ 
; 

CREATE TRIGGER tgr 
    BEFORE UPDATE ON line 
    FOR EACH ROW 
    EXECUTE PROCEDURE fn_1(); 
+0

Sie sollten "ist distinct von" anstelle von '<> verwenden, um NULL-Werte richtig zu behandeln. –

+0

ja - aus irgendeinem Grund nahm ich ID ist PK. Danke für die Nachricht! –

+0

Vielen Dank für Ihre Antwort. Das habe ich getan. Obwohl ich urkomisch finde, dass ich so viel brauche, um nur eine einzige Codezeile auszuführen. – p4x

Verwandte Themen