PostgreSQL에서 SQL의 모든 뷰를 나열하는 방법은 무엇입니까?


40

PostgreSQL에서 SQL 명령을 사용하여 데이터베이스의 모든 뷰를 어떻게 나열합니까?

psql \dv명령의 출력과 비슷한 것을 원 하지만보기 이름 목록 만 선호합니다. 예를 들어

SELECT ...;
my_view_1
my_view_2
my_view_3

Ubuntu Linux에서 PostgreSQL v9.1.4를 실행하고 있습니다.


답을 선택할 수 있습니까?
Evan Carroll

답변:


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"등과 같은 시스템 뷰를 제공하는 것 같습니다. 내가 만든 뷰를 어떻게 얻습니까?
Rob Bednark

액세스 권한이있는 목록을 제공합니다. 주어진 스키마에 대한 스키마를 얻으려면 where table_schema='USERNAME'쿼리에 추가 하십시오
Philᵀᴹ

@phil 이것은 사용자와 동일한 이름의 스키마가있는 경우에만 작동합니다. 기본적으로이 경우는 아니지만 public스키마가 있습니다.
dezso

1
INFORMATION_SCHEMA.views는 현재 사용자가 가지고있는 뷰를 보여줍니다. 데이터베이스에 현재 사용자에게 권한이없는 뷰가 있으면 해당 뷰의 이름이 결과에 표시되지 않습니다. @Phil 링크의 문서에서 : 현재 사용자가 (소유자 또는 일부 권한을 통해) 액세스 할 수있는보기 만 표시됩니다.
Cao Minh Tu

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;

IMHO,이 방법은 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.