我可以从另一个视图创建一个视图然后暂时删除吗

时间:2019-01-09 12:25:43

标签: postgresql

我想创建一个像这样的临时视图:

CREATE VIEW temp_view AS SELECT ..... 

然后通过调用一些函数来定义一个名称,我想将我的普通视图创建为:

--- my main_viewYYYYMMDD will have the contents of temp_view
DO
$$
BEGIN
EXECUTE format( 'CREATE OR REPLACE VIEW schema.%I '
                ' AS SELECT * FROM schema.temp_view', getViewName()  ) ;
END ;
$$ LANGUAGE plpgsql ;

然后DROP VIEW temp_view ;失败,因为存在从属视图。

CREATE TEMP VIEW temp_view ...可以解决此问题吗?

1 个答案:

答案 0 :(得分:3)

使用VIEW从定义中创建pg_get_viewdef

create or replace view temp_view as select * from employees;
DO
$$
BEGIN
EXECUTE format( 'CREATE OR REPLACE VIEW public.%I '
                ' AS %s ' , 'yourviewname' ,pg_get_viewdef('temp_view', true)) ;
                DROP VIEW temp_view;
END ;
$$ LANGUAGE plpgsql ;

您可能还创建了temp_view作为临时视图。临时视图会在当前会话结束时自动删除。但是,它的定义将一直显示到会话结束。对于这种情况,您无需在drop view块中包含do,以防在会话结束之前没有对它执行任何其他操作。