Eu estou querendo saber como consultar a definição de uma visão materializada no Postgres. Para referência, o que eu esperava fazer é muito semelhante ao que você pode fazer para uma visualização regular:
SELECT * FROM information_schema.views WHERE table_name = 'some_view';
que lhe dá as seguintes colunas:
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
Isso é possível para visualizações materializadas?
Da minha pesquisa até agora, parece que as visões materializadas são deliberadamente excluídas do information_schema, porque
O information_schema só pode mostrar objetos que existem no padrão SQL.
( http://www.postgresql.org/message-id/[email protected] )
Como eles parecem estar totalmente excluídos do information_schema, não tenho certeza de como fazer isso, mas o que eu gostaria de fazer é duplo:
- Consultar se existe uma visão materializada específica. (Até agora, a única maneira que encontrei de fazer isso é tentar criar uma visualização de esteira com o mesmo nome e ver se ela explode.)
- E, em seguida, consulte a definição da visualização materializada (semelhante à
view_definition
coluna eminformation_schema.views
).
Parece 9.3 ou superior, você pode fazer:
Mais informações encontradas aqui: https://stackoverflow.com/questions/29297296/postgres-see-query-used-to-create-materialized-view
Acontece que isso não era tão complicado quanto eu pensava! (Com apenas um pouco de conhecimento de pg_catalog...)
Parte 1: Consultar se existe uma visualização materializada:
Legal e fácil.
Parte 2: Consulte a definição de uma visualização materializada:
Para criar uma consulta para obter a definição da exibição de mat, primeiro tive que procurar a definição da
information_schema.views
exibição executando:Em seguida, copiei a consulta e alterei
c.relkind = 'v'::"char"
parac.relkind = 'm'::"char"
obter visualizações de mat (em vez de visualizações regulares). Veja a consulta completa aqui: http://pastebin.com/p60xwfesNeste ponto, você pode facilmente adicionar
AND c.relname = 'some_mat_view'
e executá-lo para obter a definição desome_mat_view
.Mas você ainda terá que fazer tudo de novo na próxima vez que quiser procurar a definição de uma visualização de esteira ...
Bônus: crie uma visualização para facilitar isso
Optei por criar uma nova exibição para facilitar a pesquisa de definições de exibição de esteira no futuro. Basicamente, acabei de adicionar
CREATE VIEW materialized_views AS
ao início da consulta vinculada acima para criar a nova visualização e agora posso consultá-la assim:Muito melhor!
Também posso usar essa exibição para consultar facilmente se existe uma exibição materializada alterando
*
paracount(*) > 0
.Isenção de responsabilidade : não sei se as outras colunas nos resultados da consulta estão totalmente corretas, pois as visualizações materializadas são fundamentalmente diferentes das visualizações padrão ( acho que estão certas). Mas isso pelo menos consulta o
table_schema
,table_name
eview_definition
corretamente.A desvantagem com as outras respostas aqui é que você apenas obtém a definição SQL, enquanto na maioria dos casos você está interessado nas colunas reais e pode manipulá-las como texto. A seguir está minha resposta de uma pergunta semelhante , que inclui nomes de colunas e tipos de dados:
Não posso dizer que entendo completamente o modelo de dados subjacente, então use minha solução abaixo com um grão de sal:
Você tem que mudar
'your_schema'
e'your_materialized_view'
.Postgres 14.5