2017-03-01 1 views
1

J'essaie de déclencher une exception lorsqu'une colonne en lecture seule est modifiée. Pour cela j'utilise un trigger avant la mise à jour, mais j'obtiens des erreurs de syntaxe.Soulever une exception lors de la mise à jour d'une colonne en lecture seule avec 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

Je suppose que je pourrais faire une procédure partir du code d'un groupe de lignes, mais je voudrais savoir pourquoi ce code ne fonctionne pas de toute façon.

+0

Vous ne pouvez pas mettre la ligne de code de déclenchement avec l'instruction create trigger. Vous devez créer une fonction que vous pouvez référencer. S'il vous plaît voir le manuel pour plus de détails et des exemples: https://www.postgresql.org/docs/current/static/sql-createtrigger.html#SQL-CREATETRIGGER-EXAMPLES et https://www.postgresql.org/docs/current /static/plpgsql-trigger.html –

Répondre

1

il divisé en deux étapes, comme ici:

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

Vous devriez utiliser 'ist distinct from' au lieu de' <> 'pour gérer correctement les valeurs NULL. –

+0

oui - pour une raison quelconque, j'ai supposé que id est PK. Merci pour l'avis! –

+0

Merci pour votre réponse. C'est ce que j'ai fini par faire. Bien que je trouve hilarant que j'ai tellement besoin juste d'exécuter une seule ligne de code. – p4x