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

あなたはトリガーを作成する文を使用して、トリガー・コードをインラインで配置することはできません。参照できる関数を作成する必要があります。詳細と例については、マニュアルを参照してください。https://www.postgresql.org/docs/current/static/sql-createtrigger.html#SQL-CREATETRIGGER-EXAMPLESおよびhttps://www.postgresql.org/docs/current /static/plpgsql-trigger.html –

答えて

1

はここのように、2つの段階でそれを分割:

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

NULL値を適切に処理するには、 '<>'の代わりに 'ist distinct from'を使用する必要があります。 –

+0

はい - 何らかの理由で私はIDがPKだと仮定しました。通知ありがとう! –

+0

ありがとうございました。それが私がやったことです。一行のコードを実行するだけのことが面白いと私は思いますが。 – p4x

関連する問題