Postgres에서 구체화 된 뷰의 정의 쿼리


21

Postgres에서 구체화 된 뷰의 정의를 쿼리하는 방법이 궁금합니다. 참고로, 내가하고 싶은 것은 일반보기로 할 수있는 것과 매우 유사합니다.

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

다음과 같은 열을 제공합니다.

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into

구체화 된 뷰에 이것이 가능합니까?

지금까지의 연구에서 구체화 된 뷰는 information_schema에서 의도적으로 제외 된 것으로 보입니다.

information_schema는 SQL 표준에 존재하는 객체 만 표시 할 수 있습니다.

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

그들은 information_schema에서 완전히 제외 된 것처럼 보이므로 어떻게 해야할지 모르겠지만 두 가지 방법이 있습니다.

  1. 특정 구체화 된 뷰가 존재하는지 쿼리합니다. (지금까지 내가 찾은 유일한 방법은 동일한 이름의 매트보기를 만들어보고 터지는 지 확인하는 것입니다.)
  2. 그런 다음 구체화 된보기의 정의 (의 view_definition열과 유사)를 쿼리하십시오 information_schema.views.

구체화 된 뷰에서 고유 제한 조건을 쿼리하는 것과 관련하여 다소 관련된 질문 : dba.stackexchange.com/questions/101899
Sean the Bean

존재 SELECT to_regclass('some_schema.some_mat_view')여부 를 테스트하는 빠른 방법에 관심이있을 것입니다 .-발견 된 경우 MV 일 필요는 없습니다. 세부 사항 : stackoverflow.com/questions/20582500/…
Erwin Brandstetter

답변:



13

생각만큼 복잡하지 않은 것으로 나타났습니다! (pg_catalog에 대한 약간의 지식만으로도 ...)

1 부 : 구체화 된 뷰가 존재하는지 조회

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

좋고 쉬운.

파트 2 : 구체화 된 뷰의 정의를 조회하십시오.

매트 뷰의 정의를 얻는 쿼리를 만들려면 먼저 다음 information_schema.views을 실행 하여 뷰 의 정의를 찾아야했습니다 .

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

그런 다음 쿼리를 복사하고 일반보기 대신 매트보기를 얻기 위해로 변경 c.relkind = 'v'::"char"했습니다 c.relkind = 'm'::"char". 전체 쿼리를 보려면 여기를 클릭하십시오 : http://pastebin.com/p60xwfes

이 시점 AND c.relname = 'some_mat_view'에서의 정의를 얻기 위해 쉽게 추가 하고 실행할 수 있습니다 some_mat_view.

그러나 다음에 매트보기의 정의를 찾으려면이 작업을 다시 수행해야합니다 ...

보너스 :보기 편하게 만들어보세요

앞으로 매트 뷰 정의를보다 쉽게 ​​찾을 수 있도록 새 뷰를 작성하기로 선택했습니다. 기본적으로 CREATE VIEW materialized_views AS위에 링크 된 쿼리의 시작 부분에 추가 하여 새보기를 만들었으며 이제 다음과 같이 쿼리 할 수 ​​있습니다.

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

훨씬 낫다!

또한이보기를로 변경 *하여 구체화 된보기가 존재하는지 쉽게 쿼리 할 수 ​​있습니다 count(*) > 0.

면책 조항 : 구체화 된 뷰가 표준 뷰와 근본적으로 다르기 때문에 쿼리 결과의 다른 열이 완전히 정확하다는 것을 모르겠습니다 (정확 하다고 생각합니다 ). 그러나 이것은 적어도 쿼리를 수행 table_schema, table_name그리고 view_definition정확하게.


0

다른 답변의 단점은 SQL 정의를 얻는 것입니다. 대부분의 경우 실제 열에 관심이 있고 텍스트로 조작 할 수 있습니다. 다음은 열 이름과 데이터 유형을 포함 하는 비슷한 질문에 대한 대답입니다 .

나는 기본 데이터 모델을 완전히 이해한다고 말할 수 없으므로 소금 용액으로 아래 솔루션을 사용하십시오.

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name,
    trim(leading '_' from tp.typname) as datatype
from pg_catalog.pg_attribute as attr
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid
where 
    ns.nspname = 'your_schema' and
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0
order by 
    attr.attnum

'your_schema'및 을 변경해야합니다 'your_materialized_view'.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.