在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之外,因此我不确定该怎么做,但是我想做的事情有两个:

  1. 查询是否存在特定的实例化视图。(到目前为止,我发现这样做的唯一方法是尝试创建一个具有相同名称的垫视图,看看它是否爆炸了。)
  2. 然后查询实例化视图的定义(类似于上的view_definitioninformation_schema.views)。

有关查询物化视图唯一约束的一些相关问题:dba.stackexchange.com/questions/101899
肖恩·比恩

您将对测试存在性的快速方法感兴趣:SELECT to_regclass('some_schema.some_mat_view')-如果找到了,它不一定是MV。详细信息:stackoverflow.com/questions/20582500/…–
欧文·布兰德斯特

Answers:



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部分:查询实例化视图的定义:

为了提出查询以获取mat视图的定义,我首先必须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_nameview_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'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.