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 exibição regular:
SELECT * FROM information_schema.views WHERE table_name = 'some_view';
que fornece 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?
De minhas pesquisas até agora, parece que as visualizações materializadas são deliberadamente excluídas do information_schema, porque
O information_schema pode mostrar apenas objetos que existem no padrão SQL.
( http://www.postgresql.org/message-id/[email protected] )
Como eles parecem ser totalmente excluídos do information_schema, não sei como fazer isso, mas o que eu gostaria de fazer é duplo:
- Pergunte se existe uma exibição materializada específica. (Até agora, a única maneira que encontrei para fazer isso é tentar criar uma exibição de tapete com o mesmo nome e ver se ela explode.)
- E, em seguida, consulte a definição da visualização materializada (semelhante à
view_definition
colunainformation_schema.views
).
postgresql
materialized-view
postgresql-9.4
information-schema
Sean, o Feijão
fonte
fonte
SELECT to_regclass('some_schema.some_mat_view')
- se encontrado, não precisa ser um MV. Detalhes: stackoverflow.com/questions/20582500/…Respostas:
Parece com 9.3 e acima, você pode fazer:
Mais informações encontradas aqui: /programming/29297296/postgres-see-query-used-to-create-materialized-view
fonte
Acontece que isso não foi tão complicado quanto eu pensava! (Com apenas um pouco de conhecimento de pg_catalog ...)
Parte 1: consulte se existe uma exibição materializada:
Legal e fácil.
Parte 2: consulte a definição de uma visão materializada:
Para criar uma consulta para obter a definição da exibição de tapete, primeiro tive que procurar a definição da
information_schema.views
exibição executando:Em seguida, copiei a consulta e mudei
c.relkind = 'v'::"char"
parac.relkind = 'm'::"char"
para obter visualizações de esteira (em vez de visualizações regulares). Veja a consulta completa aqui: http://pastebin.com/p60xwfesNeste ponto, você pode facilmente adicioná
AND c.relname = 'some_mat_view'
-lo e executá-lo para obter a definição desome_mat_view
.Mas você ainda precisará fazer isso novamente da próxima vez que desejar pesquisar a definição de uma exibição de tapete ...
Bônus: crie uma visualização para facilitar isso
Optei por criar uma nova visualização para facilitar a pesquisa de definições de visualização de esteira no futuro. Basicamente, acabei de adicionar
CREATE VIEW materialized_views AS
o início da consulta vinculada acima para criar a nova visualização e agora posso consultá-la da seguinte forma:Muito melhor!
Também posso usar essa visualização para consultar facilmente se existe uma visualização materializada, alterando
*
paracount(*) > 0
.Isenção de responsabilidade : não sei, 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 corretas). Mas isso faz pelo menos a consulta
table_schema
,table_name
eview_definition
corretamente.fonte
A desvantagem das 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, é minha resposta de uma pergunta semelhante , que inclui nomes de colunas e tipos de dados:
Não posso dizer que entendi completamente o modelo de dados subjacente; portanto, use minha solução abaixo com um pouco de sal:
Você tem que mudar
'your_schema'
e'your_materialized_view'
.fonte