首页 > 解决方案 > Postgresql - 如何执行视图定义?

问题描述

我想“测试”一个 postgres 视图 sql 的执行。就像是

select exec(select pg_get_viewdef('schema.materialized_view_name', true))

(这不起作用)

我正在使用物化视图。物化视图正在从外部数据包装表中选择数据,我想在刷新视图之前“测试”sql 代码。底层数据源架构可能已更改,我想确保我的物化视图中不会没有数据。我宁愿拥有过时的缓存数据,也不愿没有数据。

总而言之:

  1. 测试以确保物化视图中的 sql 查询返回有效结果(计数 > 0)
  2. 运行物化视图以更新数据。

这可能吗?

标签: sqlpostgresqlmaterialized-views

解决方案


您可以使用动态 SQL:

CREATE FUNCTION test_viewdef(view_to_test regclass) RETURNS boolean
   LANGUAGE sql SET transaction_read_only = on AS
$$DECLARE
   dummy integer;
BEGIN
   EXECUTE format(
              'SELECT 42 FROM (%s) LIMIT 0',
              pg_get_viewdef(view_to_test)
           ) INTO dummy;
   RETURN TRUE;
EXCEPTION
   WHEN OTHERS THEN
      RETURN FALSE;
END;$$;

请注意,LIMIT 0它无法防止长时间执行。


推荐阅读