PostgreSQL 9.1の動的トリガーによって作成されたすべてのパーティションを一覧表示したい。
フランクハイケンスによるこの関連回答 を使用して、パーティションの数を生成することができました。
foo_1
、foo_2
などを動的に作成する挿入トリガーを持つテーブルfoo
があります。挿入するパーティションは、範囲ベースのパーティションである主キーIDに基づいて選択されます。
テーブルfoo
に現在配置されているすべてのパーティションを表示することは可能ですか?
リンクした回答の最初のクエリを使用し、単純なWHERE
句を追加して、単一のテーブルのパーティションを取得します。
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';
オブジェクト識別子タイプ regclass
を使用すると、これを大幅に簡略化できます。
parent_schema.foo
のすべての子テーブルを一覧表示します。
SELECT i.inhrelid::regclass AS child -- optionally cast to text
FROM pg_inherits i
WHERE i.inhparent = 'my_schema.foo'::regclass;
regclass
へのキャストに指定するテーブル名は、オプションでスキーマ修飾することができます。そうでない場合、 search_path
が可視性を決定します。
同様に、返されたテーブル名はスキーマで修飾され、必要に応じて自動的にエスケープされます。
非常に安全、迅速、便利です。
ところで、 行ごとにソーステーブルを表示 任意のテーブルから取得した任意の行:
SELECT tableoid::regclass AS source, *
FROM my_schema.foo
WHERE <some_condition>;