Postgresqlで現在のユーザーが所有するすべてのスキーマのすべてのテーブルをリストするにはどうすればよいですか?


25

私はすべてのスキーマのすべてのテーブルをリストすることができます

> \dt *.*

しかし、それはまた、私が気にする私のテーブルよりもはるかに多いシステムテーブルをリストしています。パブリックスキーマおよび定義したスキーマで作成したすべてのテーブル(および場合によってはビュー)が欲しいです。

ここで説明するように、スキーマを作成するときに検索パスに明示的にスキーマを追加することなく、これを行う方法を見つけたいと思っています。

/programming//a/12902069

編集:

受け入れられた答えに基づいて、次のビューを作成しました。

create view my_tables as 
select table_catalog, table_schema, table_name, table_type 
from information_schema.tables 
where table_schema not in ('pg_catalog', 'information_schema');

そして今、次のコマンドは私が欲しいものを与えてくれます:

select * from my_tables;

回答:


32

これにより、現在のユーザーが所有しているテーブルだけでなく、現在のユーザーがアクセスできるすべてのテーブルが一覧表示されます。

select *
from information_schema.tables
where table_schema not in ('pg_catalog', 'information_schema')
and table_schema not like 'pg_toast%'

not like 'pg_toast%'しかし、実際に必要かどうかは完全にはわかりません。)

所有者情報が本当に必要なのであれば、おそらくpg_classテーブルと関連テーブルを使用する必要があります。

編集:これは所有者情報を含むクエリです:

select nsp.nspname as object_schema,
       cls.relname as object_name, 
       rol.rolname as owner, 
       case cls.relkind
         when 'r' then 'TABLE'
         when 'm' then 'MATERIALIZED_VIEW'
         when 'i' then 'INDEX'
         when 'S' then 'SEQUENCE'
         when 'v' then 'VIEW'
         when 'c' then 'TYPE'
         else cls.relkind::text
       end as object_type
from pg_class cls
  join pg_roles rol on rol.oid = cls.relowner
  join pg_namespace nsp on nsp.oid = cls.relnamespace
where nsp.nspname not in ('information_schema', 'pg_catalog')
  and nsp.nspname not like 'pg_toast%'
  and rol.rolname = current_user  --- remove this if you want to see all objects
order by nsp.nspname, cls.relname;

これで十分です。これからmy_tablesというビューを作成します。
ピーターグローブ

素晴らしい答え、when 'm' then 'MATERIALIZED_VIEW'その新しいタイプを示すためにa を追加します。
フォーブスミスター

別の答えは簡潔ですが、これは名前空間を除外するときに関連する可能性があります。
mlt

18

質問に対する短い答えは次のとおりです。

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;

-3

こちらをご覧ください。すべてのテーブル:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.