2010-01-05 4 views
0

J'ai une table définie comme ceci:PostgreSql - Contrainte pas appliquée par un déclencheur

CREATE TABLE A (
    begin date, 
    end date, 
    CONSTRAINT ordered_dates CHECK (begin <= end) 
) 

..et 2 déclencheurs associés:

  • trigger1 sur la mise à jour AVANT
  • trigger2 sur la mise à jour AFTER

Dans le trigger1, il y a un insert dans une seconde table B en calculant l'intervalle (= end-begin).

Si n'est pas respecté la contrainte ordered_dates, i ont de mauvaises valeurs insérées dans le tableau B. Mais la contrainte semble être vérifier uniquement lors de la mise à jour pas dans la gâchette AVANT.

Est-ce que je dois tester encore une fois la commande ordered_date dans le trigger1 avant que & ne déclenche une exception dans le trigger avant ?? Je sais comment faire mais j'ai la duplication de code d'une certaine manière.

+0

Bienvenue sur SO - vous pouvez lire les informations sur la fonction de démarquage pour les questions suivantes: http://stackoverflow.com/editing-help –

Répondre

2

Votre déclencheur se déclenche avant l'insertion, donc il obtient les valeurs avant que les contraintes aient été appliquées.

Oui, vous devez vérifier les valeurs ou appliquer le déclencheur après insertion.

0

Ce n'est pas un problème, car la transaction sera interrompue lorsque la contrainte CHECK se déclenche et échoue, et donc l'insertion dans la table B sera annulée (correctement).

Questions connexes