PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Role (ou trigger) récursivement contrariant

Technique - général | Role (ou trigger) récursivement contrariant

Par ricobanga le 13/07/2008 - 10:46

Bonjour, je cherche à gérer les ordre d'apparition de données dans une table (reflexive), à l'aide d'un champ order.
Pour modifier les ordres facilement et élégament, je voulais faire un rôle qui modifie automatiquement les ordres des autres lignes lors de la modification d'un ordre sur un ligne, comme ceci (si un ordre est "descendu") :

CREATE RULE update_order_down AS
ON UPDATE TO import.articles
WHERE
new.art_order < old.art_order
AND new.art_parent_id = old.art_parent_id
DO
UPDATE import.tac_articles
SET art_order = gart_order + 1
WHERE
art_parent_id = art_parent_id
AND articles.art_order >= new.art_order
AND articles.art_order < old.art_order
AND articles.art_id <> new.art_id;

(en gros si j'ai les lignes [name:order] A:1, B:2, C:3 et D:4, passer C en 1 updaterait A et B pour avoir C:1, A:2, B:3 et D:4)
Le probleme est que ligne updatée va déclenclencher le rôle pour elle même et provoquer l'erreur "infinite recursion for role detected"
J'ai essayé avec un trigger en plpgsql commençant par "ALTER TABLE import.articles DISABLE TRIGGER", mais on ne peut faire alter si la requête est en cours.

Il y a bien la solution qui effectuerait le rôle sur une vue, mais je me demandais si quelqu'un connaissait une solution élégante pour empêcher la récursion d'un rôle ON UPDATE lorsque cette update est effectué par le rôle lui même.

Merci beaucoup. Henry

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

partiellement résolu

ricobanga/ = 15 Juillet, 2008 - 13:40

Bon, j'ai réussi à le faire simplement avec un trigger, mais j'ai du ajouter un champ dont l'assignation d'une valeur (depuis le trigger) neutralise l'effet récursif. Ca manque d'élégance mais ca marche, bon ...


© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.