开发者社区> 问答> 正文

PostgreSQL 刷新物化视图语句不允许。

之前提了一个issue,但是问题没有被解决https://github.com/alibaba/druid/issues/4931。 之前的问题是刷新物化视图的语句可以被解析识别,但是刷新物化视图语句不被允许。在发布新版本之后,即使更新到了1.2.13版本也会出现执行不被允许的情况。

Caused by: java.sql.SQLException: sql injection violation, dbType postgresql, druid-version 1.2.4, class com.alibaba.druid.sql.ast.statement.SQLRefreshMaterializedViewStatement not allow : refresh materialized view <table_name>

能不能在com.alibaba.druid.wall.WallConfig里增加一个是否允许刷新物化视图的属性,这样使用起来也方便一些。

原提问者GitHub用户shenQQQ

展开
收起
山海行 2023-07-05 17:59:59 124 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在 PostgreSQL 中,可以使用 REFRESH MATERIALIZED VIEW 语句来刷新物化视图。但是,在某些情况下,REFRESH MATERIALIZED VIEW 语句可能会被禁止,例如:

    物化视图依赖于不稳定的函数
    如果物化视图中使用了不稳定的函数,例如随机数函数或当前时间函数等,那么刷新物化视图可能会导致结果不一致。为了避免这种情况,PostgreSQL 不允许对这些物化视图进行刷新。

    物化视图依赖于其他物化视图
    如果物化视图依赖于其他物化视图,那么刷新物化视图可能会导致依赖关系不一致。为了避免这种情况,PostgreSQL 不允许对这些物化视图进行刷新。

    物化视图定义中包含 WITH NO DATA 子句
    如果物化视图定义中包含 WITH NO DATA 子句,那么该物化视图不包含任何数据,因此无法刷新。为了避免这种情况,应该在定义物化视图时省略 WITH NO DATA 子句。

    2023-07-30 20:57:01
    赞同 展开评论 打赏
  • 在com.alibaba.druid.wall.WallConfig中增加一个是否允许刷新物化视图的属性是一个好主意,这样可以让使用者更加灵活地控制Druid的行为。您可以考虑在com.alibaba.druid.wall.WallConfig中添加一个名为“refreshMaterializedView”的属性,该属性可以设置为true或false,表示是否允许刷新物化视图。然后,在Druid的代码中,您可以根据该属性来判断是否允许执行刷新物化视图的语句。

    2023-07-09 10:18:30
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.14

    原回答者GitHub用户wenshao

    2023-07-06 10:38:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖大会:开源 PolarDB 架构演进、关键技术与社区建设 立即下载
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载