PostgreSQLのSQLのすべてのビューをリストする方法は?


40

PostgreSQLでSQLコマンドを使用してデータベースのすべてのビューを一覧表示するにはどうすればよいですか?

psql \dvコマンドの出力に似たものが欲しいのですが、ビュー名のリストだけが望ましいです。例えば、

SELECT ...;
my_view_1
my_view_2
my_view_3

Ubuntu LinuxでPostgreSQL v9.1.4を実行しています。


答えを選べますか?
エヴァンキャロル

回答:


42

ドキュメントから:

 select table_name from INFORMATION_SCHEMA.views;

システムビューを結果にしたくない場合は、これを試してください。

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))

ありがとう@Phil。ただし、このコマンドは128行を返しますが、\ dvは57行を返します。「テーブル」、「列」、「ドメイン」、「pg_role」などのシステムビューも提供しているようです。作成したビューだけを取得するにはどうすればよいですか。
ロブベッドナーク

アクセスできるもののリストが表示されます。指定されたスキーマのためのものを取得するには、追加where table_schema='USERNAME'クエリに
Philᵀᴹ

@philこれは、ユーザーと同じ名前のスキーマがある場合にのみ機能します。デフォルトではそうではありませんが、publicスキーマがあります。
dezso

1
INFORMATION_SCHEMA.viewsは、現在のユーザーが権限を持っているビューのみを表示します。現在のユーザーに権限がないデータベースにビューがある場合、それらのビューの名前は結果に表示されません。@Philのリンクにあるドキュメントから:現在のユーザーがアクセスできるビュー(所有者である、または何らかの特権を持つ)のみが表示されます。
カオミン火

21

pg_catalog.pg_views必要な情報を照会できます。

select viewname from pg_catalog.pg_views;

スキーマ名を取得するための洗練されたクエリ-異なるスキーマに同じ名前のビューが複数ある場合に備えて-それらのシステムビューを省略しました。

select schemaname, viewname from pg_catalog.pg_views
where schemaname NOT IN ('pg_catalog', 'information_schema')
order by schemaname, viewname;

私見、この方法は、Philの回答に対する私のコメントで述べられている理由で、INFORMATION_SCHEMA.viewsをクエリするよりも優れています。


4

で対話的にのみ必要な場合はpsql\dvビューの表示や\dmマテリアライズドビューの使用にも使用できます。またはを使用して+のように、\dm+(マテリアライズド・ビューのサイズを確認するには、主に便利な)いくつかの追加情報を表示するために、たとえば。


1
\dv *.*そして\dm *.* 、すべてのスキーマに関するそれらの情報のために!

3

試してください:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
    WHERE c.relkind  = 'v'
;

さらに詳細が必要な場合は、ニーズに合わせて以下を変更できます。

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name,
        s.n_live_tup AS row_count,
        count (a.attname) AS column_count,
        pg_catalog.obj_description(c.oid, 'pg_class') AS comments,
        CASE c.relkind
            WHEN 'v'
            THEN pg_catalog.pg_get_viewdef(c.oid, true)
            ELSE null
            END AS query
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
         LEFT JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid AND a.attnum > 0 AND NOT a.attisdropped)
         LEFT JOIN pg_catalog.pg_stat_all_tables s ON (c.oid = s.relid)
    WHERE c.relkind  = 'v'
GROUP BY n.nspname,
        c.relowner,
        c.relkind,
        c.relname,
        s.n_live_tup,
        c.oid
ORDER BY n.nspname,
        c.relname
;

2

viewカタログをリストするために作成しましたviews

create or replace view show_views as 
select table_name from INFORMATION_SCHEMA.views 
WHERE table_schema = ANY (current_schemas(false));

そして、データベース内のすべてのビューを表示する場合、次のように記述します。

select * from show_views;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.