Vous n'êtes pas identifié(e).
Bonjour,
Nous sommes en train de faire des tests sur posgresql 9.1.2 (nous n'avons encore aucune base pg en production, nous "découvrons" le produit) et nous constatons le comportement suivant qui (a priori) nous surprend :
- soit une table T1 avec une colonne C1 et un index simple sur C1 créé comme suit :
CREATE TABLE T1 ( C1 varchar (10)) ;
CREATE INDEX NDX_TEST ON T1 (C1);
résultat : on a dans les tables systèmes :
dans pg_class : une table de nom T1 et un index de nom NDX_TEST : OK
dans pg_index : un index rattaché aux 2 enregistrements dans pg_class (pg_index.indrelid = oid de la table dans pg_class et pg_index.indexrelid = oid de l'index dans pg_class) : OK
dans pg_attribute : une ligne avec attname = 'C1' correspondant à la colonnne de la table et un autre ligne avec attname = 'C1' correspondant à la colonne indexée (apparemment une colonne est présente dans pg_attribute en tant que colonne + autant de fois qu'elle est indexée) : OK
- on renomme la colonne C1 :
ALTER TABLE RENAME COLUMN C1 TO C1_TOTO ;
résultat :
- la colonne est bien renommée
- dans pg_attribute, on a :
une ligne avec attname = 'C1_TEST' correspondant à la colonne de la table
une ligne avec attname = 'C1' correspondant à la colonne indexée (mais donc avec l'ancien nom de la colonne).
Conclusion :
il semble que le renommage d'une colonne ne renomme pas les composantes des index.
Dès lors l'index va-t-il toujours pouvoir être utilisé par PG ??
En regardant la documentation, on trouve dans les notes de version de la 7.2 (de mémoire, je ne retrouve plus la page) que ce renommage avait alors été implémenté.
Constatez vous la même chose ou avons nous loupé quelque chose ?
Merci de vos lumières, cordialement, Arnaud.
Hors ligne
La commande \d matable de psql, ainsi que pg_dump -s permettent de voir du point de vue de l'utilisateur sur quoi porte l'index.
En regardant là, on voit que le renommage d'une colonne est bien propagé à l'index.
La question de savoir pourquoi pg_attribute.attname n'est pas renommé pour l'index a une réponse ici:
http://archives.postgresql.org/pgsql-ha … g01398.php
Mais plus généralement il faut éviter de supposer quoi que ce soit sur les tables de pg_catalog, c'est quand même essentiellement de la tambouille interne du SGBD susceptible de changer d'une version majeure à l'autre.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Bonjour,
Merci de cette réponse très claire.
\d T1 donne effectivement les noms des index avec leurs composantes exactes.
Mais dès lors, comment fait-on pour obtenir par une requête le nom des composantes d'un index ?
Car si on interroge pg_attribute, on a donc le risque d'avoir des noms de colonnes qui ne sont plus à jour.
Or nous avons justement besoin de connaitre les composantes des index, afin de les comparer avec les index définis dans un outil de modélisation et ainsi de décider de supprimer et recréer l'index s'il n'est plus à jour (par exemple s'il ne porte plus sur le mêmes composantes).
Merci par avances de vos conseils.
Cdlt, Arnaud.
Hors ligne
Le plus simple, c'est de demander à psql quelles requêtes il exécute dans votre dos pour afficher tous ces résultats. Ça se fait en lancer psql -E (echo hidden)
Marc.
Hors ligne
Merci beaucoup !
Effectivement, c'est très pratique.
Du coup, on a pu constater qu'il fallait utiliser la fonction pg_get_indexdef
Par exemple :
SELECT pg_get_indexdef(indexrelid) FROM pg_index WHERE pg_index.indrelid = 'T1'::regclass
donne la définition des index, avec entre autres les noms des composantes à jour.
SELECT pg_get_indexdef(indexrelid, 1, false) FROM pg_index WHERE pg_index.indexrelid = 'monindex'::regclass
...permet d'obtenir le nom de la 1ère composante de l'index.
Grand merci à vous deux.
Cdlt, Arnaud.
Hors ligne