web-dev-qa-db-ja.com

Postgresのマテリアライズドビューの定義を問い合わせます

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/[email protected]

それらは完全にinformation_schemaから除外されているように見えるため、これをどのように行うかはわかりませんが、私がしたいことは2つあります。

  1. 特定のマテリアライズドビューが存在するかどうかを問い合わせます。 (これまでのところ、これを行うための唯一の方法は、同じ名前のマットビューを作成して、それが爆発するかどうかを確認することです。)
  2. 次に、マテリアライズドビューの定義をクエリします(view_definitioninformation_schema.views列と同様)。
21
Sean the Bean

これは思ったほど複雑ではないことがわかりました! (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に変更することで、マテリアライズドビューが存在するかどうかを簡単にクエリできます。

免責事項:マテリアライズドビューは標準ビューとは根本的に異なるため(Ithink彼らは正しいです)。しかし、これは少なくとも_table_schema_、_table_name_および_view_definition_を正しくクエリします。

13
Sean the Bean

9.3以上のように見えます:

select * from pg_matviews;
select * from pg_matviews where matviewname = 'view_name';

詳細はここにあります: https://stackoverflow.com/questions/29297296/postgres-see-query-used-to-create-materialized-view

30
Dustin

ここでの他の回答の欠点は、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'