PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 07/10/2011 16:46:30

mg
Membre

[postgresql9.0] Migration de base et triggers

Bonjour,

Je viens de passer ma base de données de postgresql 8.4 à 9.0. Pas de soucis pour la migration des tables en elles mêmes, par contre certains de mes triggers ne fonctionnent plus.

Par exemple

BEGIN
--Si la géométrie a été modifiée ou si x ou y sont vides
IF (NEW.the_geom != OLD.the_geom) OR OLD.x IS NULL OR OLD.y IS NULL THEN -- alors on modifie les colonnes x et y
NEW.x=x(astext(NEW.the_geom));
NEW.y=y(astext(NEW.the_geom));
ELSE -- si la géométrie n'a pas été mofidiée
-- mais si on a modifié manuellement les colonnes x et y
IF (NEW.x != OLD.x) OR (NEW.y != OLD.y) THEN  -- alors on intègre la nouvelle géométrie à partir des nouvelles valeurs de x et y
NEW.the_geom=geometryfromtext('POINT('||NEW.x||' '||NEW.y||')',2154);
END IF;
END IF;
RETURN NEW;
END;

Si je modifie un objet de la table, j'obtiens :

Erreur lors de l'exécution du lien centre pour la raison suivante :
ERREUR: l'opérateur n'est pas unique : geometry <> geometry
LINE 1:SELECT (NEW.the_geom != OLD.the_geom) OR OLD.x ...

HINT: N'a pas pu choisir un meilleur candidat pour l'opérateur. Vous devez ajouter une conversion explicite de type.

Je n'ai rien trouvé dans la documentation concernant une modification dans l'écriture des triggers, l'un de vous a-t-il une piste ??
A noter que lors de la validation de mon trigger suite à des modifs d'essai, je n'ai pas de message d'erreur, donc le code a l'air valide.

merci

Hors ligne

#2 07/10/2011 16:57:56

rjuju
Administrateur

Re : [postgresql9.0] Migration de base et triggers

Cette erreur provient d'une modification de PostGIS et non Postgresql.

Vous pouvez utiliser "NOT ST_Equals(OLD.the_geom,NEW.the_geom)" à la place de l'opérateur !=

http://www.postgis.org/docs/ST_Equals.html

Hors ligne

#3 07/10/2011 16:58:05

Marc Cousin
Membre

Re : [postgresql9.0] Migration de base et triggers

Ce n'est pas un problème du trigger lui-même.

Le problème, c'est que Posgresql n'arrive pas à trouver d'opérateur d'égalité (ou d'inégalité…) entre deux géométries. Êtes-vous sûr que Postgis est installé correctement ? Il doit en manquer un bout…


Marc.

Hors ligne

#4 07/10/2011 17:00:28

Marc Cousin
Membre

Re : [postgresql9.0] Migration de base et triggers

Au passage, ST_Equals et = n'ont pas le même sens avec Postgis. Le =, c'est l'égalité des BBox.


Marc.

Hors ligne

#5 07/10/2011 17:03:20

rjuju
Administrateur

Re : [postgresql9.0] Migration de base et triggers

Autant pour moi, désolé

Hors ligne

#6 07/10/2011 17:19:50

Marc Cousin
Membre

Re : [postgresql9.0] Migration de base et triggers

C'était pas pour te corriger spécialement, rjuju, c'est aussi une erreur que beaucoup de gens semblent faire avec Postgis (et on ne s'en aperçoit que quand un bug bizarre surgit smile )


D'ailleurs, je n'ai pas d'opérateur <>, ni !=, après test avec Postgis 1.5 sur une 9.0.5, seulement l'opérateur =

L'opérateur <> n'aurait pas été créé spécialement dans la version précédente ? Le message est l'opérateur n'est pas unique… Est-ce qu'il n'y en aurait pas effectivement 2 différents ?

Que donne la commande \do dans psql ?


Marc.

Hors ligne

#7 13/10/2011 14:33:31

mg
Membre

Re : [postgresql9.0] Migration de base et triggers

Bonjour,

Je suppose que postgis 1.5 est bien installé., car ce n'est pas qui l'ai fait. Je vais vérifier ça avec l'informaticien.
Pour la commande \do dans psql, je me fait jeter proprement, je  pense que je ne dois pas bien la taper (variable non reconnue ???)

Par contre la solution  NOT ST_Equals(OLD.the_geom,NEW.the_geom) de rjuju a l'air de bien fonctionner. Je vais creuser par là pour modifier mes triggers.

Merci

Hors ligne

#8 13/10/2011 14:41:00

Marc Cousin
Membre

Re : [postgresql9.0] Migration de base et triggers

Je ne dis pas que NOT ST_Equals ne marche pas. Je dis juste que ça ne veut pas dire du tout la même chose smile
Peut-être que le code initial avait un bug, s'il utilisait != pour tester l'inégalité entre deux géométries: le résultat sera surement identique dans 99,9% des cas, avec une erreur bizarre de temps en temps.


Marc.

Hors ligne

#9 13/10/2011 15:11:56

mg
Membre

Re : [postgresql9.0] Migration de base et triggers

ok je pige, dans ce cas, le code initial n'était effectivement pas juste vu l'objectif que j'avais (c'est normal, c'est le mien tongue).

la piste du \do n'est pas mal non plus, car je viens de m'apercevoir que je n'ai même pas l'opérateur = dans ma liste. Je vais voir à corriger ça. Un postgis installé bien complet, ça sera quand même mieux pour bosser.

Hors ligne

Pied de page des forums