在运行时更改视图源模式

时间:2019-11-01 14:29:26

标签: sql postgresql view temp-tables

我有x层深度视图层次结构:

create view view1 as (select * from my_table);
create view view2 as (select * from view1);
create view view3 as (select * from view2);
create view view4 as (select * from view3);
...

然后我有一个查询,该查询从最后一个viewX中选择。我想在运行时向视图添加一些筛选,而无需修改该查询。而且这些过滤器应仅适用于当前会话,因此我不想重新创建或更改任何视图。

我试图用同名的CTE /临时视图/临时表覆盖需要过滤的视图。如果层次结构不超过两个级别,那么所有这些都可以工作:

create temp view view2 as (select * from view1 where some_condition = 1)

此后(在同一会话中)select * from view2返回预期的过滤结果,因为使用了临时视图而不是原始视图。但是select * from view3仍会返回未过滤的结果,因为它似乎始终在内部使用public.view2

有什么方法可以定义视图,从而在运行时自动在临时模式和公共模式之间更改其源模式?

一个实际可行的解决方案是创建postgresql函数,该函数将源关系名称作为参数,并从临时模式(如果找到)返回结果,否则从公共模式返回结果。但理想情况下,我想保持当前视图定义不变。如果临时视图可以与这些嵌套视图一起使用,那么它们将是完美而简单的解决方案。

0 个答案:

没有答案