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から完全に除外されているように見えるので、私はこれについてどうするかわかりませんが、私がやりたいことは2つあります:

  1. 特定のマテリアライズドビューが存在するかどうかを照会します。(これまでのところ、これを行うことがわかった唯一の方法は、同じ名前のマットビューを作成し、それが爆発するかどうかを確認することです。)
  2. 次に、マテリアライズドビューの定義を照会します(view_definition上の列と同様information_schema.views)。

マテリアライズドビューのユニークな制約のクエリに関するやや関連する質問:dba.stackexchange.com/questions/101899
ショーン・

存在をテストする高速な方法に興味があります。- SELECT to_regclass('some_schema.some_mat_view')見つかった場合、MVである必要はありません。詳細:stackoverflow.com/questions/20582500/...
アーウィン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_schematable_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.