之前提了一个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
在 PostgreSQL 中,可以使用 REFRESH MATERIALIZED VIEW 语句来刷新物化视图。但是,在某些情况下,REFRESH MATERIALIZED VIEW 语句可能会被禁止,例如:
物化视图依赖于不稳定的函数
如果物化视图中使用了不稳定的函数,例如随机数函数或当前时间函数等,那么刷新物化视图可能会导致结果不一致。为了避免这种情况,PostgreSQL 不允许对这些物化视图进行刷新。
物化视图依赖于其他物化视图
如果物化视图依赖于其他物化视图,那么刷新物化视图可能会导致依赖关系不一致。为了避免这种情况,PostgreSQL 不允许对这些物化视图进行刷新。
物化视图定义中包含 WITH NO DATA 子句
如果物化视图定义中包含 WITH NO DATA 子句,那么该物化视图不包含任何数据,因此无法刷新。为了避免这种情况,应该在定义物化视图时省略 WITH NO DATA 子句。
在com.alibaba.druid.wall.WallConfig中增加一个是否允许刷新物化视图的属性是一个好主意,这样可以让使用者更加灵活地控制Druid的行为。您可以考虑在com.alibaba.druid.wall.WallConfig中添加一个名为“refreshMaterializedView”的属性,该属性可以设置为true或false,表示是否允许刷新物化视图。然后,在Druid的代码中,您可以根据该属性来判断是否允许执行刷新物化视图的语句。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。