Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Débuter
Débuter Forum d'entraide : Débuter en base de données avec PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/12/2012, 22h47   #1
Elagym
Invité de passage
 
Homme
Inscription : décembre 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 3
Points : 1
Points : 1
Par défaut Annuler/empêcher l'incrémentation d'une séquence

Bonjour à tous,

Je suis étudiant en informatique (en Bac2) et je viens faire appel à vous dans l'urgence, ayant un projet à présenter à courte échéance (demain).

Voici donc mon problème :

Je dispose d'une table hp.annees à laquelle j'ai attaché une sequence seq_annees_pk, cette sequence démarre par défaut à 1 et s'incrémente de 1 à la fois.

Lorsque je fais un INSERT sur ma table hp.annees, une procédure trigger est appelée (BEFORE INSERT) et fait des vérifications pour savoir si l'année peut être insérée. Le problème est que, même si mon trigger renvoie une exception, ma séquence s'incrémente malgré tout.

J'ai pensé à plusieurs solutions :
-Existe-t-il une manière d'annuler/empêcher l'auto-incrémentation de ma séquence quand mon trigger renvoie une exception ?
-J'ai également tenté de place la ligne de code suivante juste avant ma RAISE EXCEPTION :
Citation:
ALTER SEQUENCE hp.seq_annees_pk RESTART WITH ((SELECT count(*) from hp.annees)+1);
En vain car manifestement je ne peux rien mettre d'autre qu'un INTEGER à la suite du RESTART WITH (nb: même en mettant une variable INTEGER cela ne fonctionne pas)

Auriez-vous une piste à me proposer ?

Merci de votre attention
Elagym est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 13h52   #2
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
Pourquoi ne pas déclencher le nextval de la séquence après les vérifications dans le trigger?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 18h48   #3
Elagym
Invité de passage
 
Homme
Inscription : décembre 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 3
Points : 1
Points : 1
Citation:
Envoyé par estofilo Voir le message
Pourquoi ne pas déclencher le nextval de la séquence après les vérifications dans le trigger?
Cela signifie donc qu'il est possible d'empêcher la séquence de s'auto-incrémenter lors de l'insertion d'un nouvel élément et de le faire manuellement à la place ?
Elagym est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 19h02   #4
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 708
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 708
Points : 2 355
Points : 2 355
Supposons qu'il y ait une table avec une colonne associée à une séquence via la clause DEFAULT:
Code :
macolonne INT DEFAULT NEXTVAL('masequence');
Il faut enlever cette clause DEFAULT.

A la place à l'endroit qui va bien dans le trigger sur INSERT, faire
Code :
NEW.macolonne := NEXTVAL('masequence');
Donc quand ce code n'est pas exécuté, la séquence n'est pas touchée.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 15h43   #5
Elagym
Invité de passage
 
Homme
Inscription : décembre 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 3
Points : 1
Points : 1
C'est une excellente suggestion qui m'a permis de résoudre le problème.

Merci beaucoup du coup de pouce
Elagym est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h37.


 
 
 
 
Partenaires

Hébergement Web