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つあります。
view_definition
のinformation_schema.views
列と同様)。これは思ったほど複雑ではないことがわかりました! (pg_catalogの知識が少しあれば...)
_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';
_
簡単です。
マットビューの定義を取得するクエリを作成するには、最初に_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
_を正しくクエリします。
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
ここでの他の回答の欠点は、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'
。