Recherche

Calendrier

Février 2010
L M M J V S D
1 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
             
<< < > >>

Illustrations

  • Eleanore O'Ryan
  • Drow.jpg

Catégories

Présentation

Recommander

Mardi 4 août 2009 2 04 /08 /2009 09:51
Donc ce matin, dans le cadre des contrôles faits sur la base de données d'Overblog, je me trouve confronté au problème suivant : comment lister les tables héritant d'une table donnée, et ce quel que soit le niveau d'héritage.De petites recherches sur google et les archives PostgreSQL ne m'ayant pas offert de réponse satisfaisante, je me risque à aller faire un tour sur les channel IRC de freenode : #postgresql et #postgresqlfr. C'est souvent la meilleure source d'information, avec le plus souvent des réponses extrèmement rapides et précises. Entre temps j'ai quand même découvert que l'option -E de psql permetait d'afficher les requètes exécutées pour les commandes internes. Ca peut s'avérer fort utile en cas de fouilles archéologique au sein d'une base. 

Mais passons là dessus... Donc au final, j'obtiens quelques requềtes, et surtout la confirmation qu'il n'est pas possible d'obternir l'ensemble des tables héritées d'une table donnée, quel que soit le niveau, avec PostgreSQL 8.3, qui ne gère pas la récursivité dans une requête. une procédure stockée est donc nécessaire. Par contre, c'est possible avec la version 8.4 récemment sortié.

Dans le cas qui m'intéresse, à part l'aspect fun d'avoir une solution marchant à tous niveaux, je sais pertnament que je n'ai que deux niveaux d'héritage. Je ferai donc deux requêtes similaires pour disposer de l'ensemble de mes tables héritées :

# SELECT inhrelid::regclass FROM pg_inherits WHERE inhparent='foo'::regclass;

Ce donne le résultat escompté et tout va bien. Toutefois, d'autres solutions ont été évoquées. Avec  PG 8.4, la requête devrait ressembler à ça :

# WITH RECURSIVE t(relid) AS (SELECT inhrelid FROM pg_inherits WHERE inhparent='foo'::regclass UNION ALL SELECT inhrelid FROM pg_inherits JOIN t ON (inhparent = t.relid)) SELECT relid::regclass FROM t;

Il me tarde d'essayer cette nouvelle version.

Pour ce qui est d'avoir l'ensemble des tables héritées quelle que soit la profondeur de l'héritage avec PG 8.3, je n'ai pas poussé les recherches, mais les pistes évoquées faisaient état de procédures stockées, d'utilisation de la contrib contrib tablefunc pour gérer la récursivité, ou encore d'user de jointures dans le cas où l'on connait le niveau maximum de récursion. 
Par Torgan - Publié dans : PostgreSQL
Ecrire un commentaire - Voir les 1 commentaires
Retour à l'accueil
 
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus