Me pregunto cómo consultar la definición de una vista materializada en Postgres. Como referencia, lo que esperaba hacer es muy similar a lo que puede hacer para una vista normal:
SELECT * FROM information_schema.views WHERE table_name = 'some_view';
que te da las siguientes columnas:
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
¿Es esto posible para vistas materializadas?
Según mi investigación hasta el momento, parece que las vistas materializadas se excluyen deliberadamente del esquema de información, porque
Information_schema solo puede mostrar objetos que existen en el estándar SQL.
( http://www.postgresql.org/message-id/[email protected] )
Como parecen estar completamente excluidos del esquema de información, no estoy seguro de cómo hacerlo, pero lo que me gustaría hacer es doble:
- Pregunte si existe una vista materializada particular. (Hasta ahora, la única forma en que he encontrado para hacer esto es intentar crear una vista mate con el mismo nombre y ver si explota).
- Y luego consulte la definición de la vista materializada (similar a la
view_definition
columna eninformation_schema.views
).
postgresql
materialized-view
postgresql-9.4
information-schema
Sean the Bean
fuente
fuente
SELECT to_regclass('some_schema.some_mat_view')
si se encuentra, no tiene que ser un MV. Detalles: stackoverflow.com/questions/20582500/…Respuestas:
Parece 9.3 y superior que puedes hacer:
Más información encontrada aquí: /programming/29297296/postgres-see-query-used-to-create-materialized-view
fuente
¡Resulta que esto no fue tan complicado como pensaba! (Con un poco de conocimiento de pg_catalog ...)
Parte 1: consulta si existe una vista materializada:
Bonito y fácil.
Parte 2: Consulta la definición de una vista materializada:
Para llegar a una consulta para obtener la definición de la vista mat, primero tuve que buscar la definición de la
information_schema.views
vista ejecutando:Luego copié la consulta y cambié
c.relkind = 'v'::"char"
ac.relkind = 'm'::"char"
para obtener vistas matizadas (en lugar de vistas normales). Vea la consulta completa aquí: http://pastebin.com/p60xwfesEn este punto, podría agregarlo
AND c.relname = 'some_mat_view'
y ejecutarlo con bastante facilidad para obtener la definición desome_mat_view
.Pero aún tendrá que volver a hacer esto la próxima vez que desee buscar la definición de una vista de mat ...
Bonificación: cree una vista para facilitar esto
Opté por crear una nueva vista para que sea más fácil buscar definiciones de vista mat en el futuro. Básicamente, acabo de agregar
CREATE VIEW materialized_views AS
al comienzo de la consulta vinculada anteriormente para crear la nueva vista, y ahora puedo consultarla así:¡Mucho mejor!
También puedo usar esta vista para consultar fácilmente si existe una vista materializada al cambiar
*
acount(*) > 0
.Descargo de responsabilidad : no lo sé, las otras columnas en los resultados de la consulta son completamente correctas, ya que las vistas materializadas son fundamentalmente diferentes de las vistas estándar ( creo que son correctas). Pero esto al menos consulta el
table_schema
,table_name
yview_definition
correctamente.fuente
El inconveniente con las otras respuestas aquí es que solo obtienes la definición de SQL, mientras que en la mayoría de los casos estás interesado en las columnas reales y puedes manipularlas como texto. La siguiente es mi respuesta de una pregunta similar , que incluye nombres de columna y tipos de datos:
No puedo decir que entiendo completamente el modelo de datos subyacente, así que use mi solución a continuación con un grano de sal:
Tienes que cambiar
'your_schema'
y'your_materialized_view'
.fuente