it-swarm.com.de

Ruft alle Partitionsnamen für eine Tabelle ab

Ich möchte alle Partitionen auflisten, die durch dynamische Trigger in PostgreSQL 9.1 erstellt wurden.
Mit diese verwandte Antwort von Frank Heikens konnte ich eine Anzahl von Partitionen generieren.

Ich habe eine Tabelle foo mit einem Einfügetrigger, der foo_1, foo_2 usw. dynamisch. Die Partition zum Einfügen wird basierend auf der Primärschlüssel-ID ausgewählt, einer bereichsbasierten Partitionierung.

Ist es möglich, alle derzeit vorhandenen Partitionen für die Tabelle foo anzuzeigen?

11
Vishnu Kumar

Verwenden Sie die erste Abfrage aus der von Ihnen verknüpften Antwort und fügen Sie eine einfache WHERE -Klausel hinzu, um die Partitionen einer einzelnen Tabelle abzurufen:

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

Mit dem Objektkennungstyp regclass kann dies erheblich vereinfacht werden:

Listen Sie alle untergeordneten Tabellen von parent_schema.foo:

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

Der Tabellenname, den Sie für die Umwandlung in regclass angeben, kann optional schemaqualifiziert sein. Wenn nicht, wird das search_path entscheidet über die Sichtbarkeit.

In ähnlicher Weise sind zurückgegebene Tabellennamen schemaqualifiziert und werden bei Bedarf automatisch maskiert.
Sehr sicher, schnell und bequem.

Übrigens zu Quelltabelle pro Zeile anzeigen für jede Zeile, die aus einer beliebigen Tabelle abgerufen wurde:

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