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
?
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';
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>;