2017-03-01 12 views
1

我試圖在只讀列被修改時引發異常。爲此,我在更新之前使用觸發器,但是我收到了語法錯誤。用PostgreSQL引發只讀列的更新異常

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

我想我可以做擴展碼了一堆行的過程,但我想知道爲什麼這個代碼不工作,無論如何。

+0

你不能把觸發器代碼內嵌在CREATE TRIGGER聲明。你需要創建一個你可以參考的函數。有關詳細信息和示例,請參閱手冊:https://www.postgresql.org/docs/current/static/sql-createtrigger.html#SQL-CREATETRIGGER-EXAMPLES和https://www.postgresql.org/docs/current /static/plpgsql-trigger.html –

回答

1

兩個步驟分開它,喜歡這裏:

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

您應該使用'ist distinct'而不是'<>'來正確處理NULL值。 –

+0

是的 - 出於某種原因,我認爲id是PK。感謝您的通知! –

+0

謝謝你的回答。這就是我最終做的。雖然我發現我只需要執行一行代碼就很熱鬧。 – p4x