Vous n'êtes pas identifié(e).
Pages : 1
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
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 !=
Julien.
https://rjuju.github.io/
Hors ligne
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
Au passage, ST_Equals et = n'ont pas le même sens avec Postgis. Le =, c'est l'égalité des BBox.
Marc.
Hors ligne
Autant pour moi, désolé
Julien.
https://rjuju.github.io/
Hors ligne
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 )
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
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
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
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
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 ).
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
Pages : 1