2017-03-01 10 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