web-dev-qa-db-fra.com

Obtenir tous les noms de partition pour une table

Je veux lister toutes les partitions créées par des déclencheurs dynamiques dans PostgreSQL 9.1.
J'ai pu générer un nombre de partitions en utilisant cette réponse connexe de Frank Heikens .

J'ai une table foo avec un déclencheur d'insertion qui crée foo_1, foo_2 etc. dynamiquement. La partition à insérer est choisie en fonction de l'ID de clé primaire, un partitionnement basé sur une plage.

Est-il possible d'afficher toutes les partitions actuellement en place pour la table foo?

11
Vishnu Kumar

Utilisez la première requête de la réponse que vous avez liée et ajoutez une simple clause WHERE pour obtenir les partitions d'une seule table:

SELECT
    nmsp_parent.nspname AS parent_schema,
    parent.relname      AS parent,
    nmsp_child.nspname  AS child_schema,
    child.relname       AS child
FROM pg_inherits
    JOIN pg_class parent            ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child             ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
    JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace
WHERE parent.relname='parent_table_name';
18
dezso

En utilisant le type d'identifiant d'objet regclass , cela peut être considérablement simplifié:

Liste toutes les tables enfants de parent_schema.foo:

SELECT i.inhrelid::regclass AS child -- optionally cast to text
FROM   pg_inherits i
WHERE  i.inhparent = 'my_schema.foo'::regclass;

Le nom de table que vous fournissez pour le transtypage en regclass peut éventuellement être qualifié de schéma. Sinon, le search_path décide de la visibilité.

De même, les noms de table retournés sont qualifiés par le schéma et échappés automatiquement si nécessaire.
Très sûr, rapide et pratique.

BTW, to afficher la table source par ligne pour toute ligne récupérée à partir de n'importe quelle table:

SELECT tableoid::regclass AS source, *
FROM   my_schema.foo
WHERE <some_condition>;
6
Erwin Brandstetter