+
 新版

如何解析并改写 SQL

ztcwh 发布于 2018/08/24 17:29
阅读 1K+
收藏 1

我们公司有如下需求:

  1. 拦截所有的 SQL 语句,分析获取到表名;
  2. 对指定的表名添加过滤条件(例:where age>=20)

 

问题:

  1. 如何解析 SQL 语句?
  2. 如何把过滤条件添加进去?不能改变已有的过滤条件。

 

由于 SQL 太过灵活,很难精确地把过滤条件动态添加上去,

有没有这样的框架?工具类?组件?可以实现此类需求呢?

 

用的是 Hibernate ORM 持久框架。

 

加载中
0
CantosSong
CantosSong

用的是什么 ORM 框架,这块是都可以的

z
ztcwh
用的是 Hibernate ORM 持久框架。
0
魔力猫
魔力猫

单表还好说一点,多表,复杂查询怎么处理。 

z
ztcwh
是多表哦,而且还是比较复杂的。各种各样的都有
0
DeMoNHaDeS
DeMoNHaDeS

以 where age>=20 建视图,将原表名替换为对应的视图名。

不知道能否满足你的需求

z
ztcwh
不行哦,我的需求是,同一个接口,不同的用户查询出来的结果要不一样,且可以动态改变,所以需要解析 SQL ,针对不同的表进行添加过滤条件。
0
魔力猫
魔力猫

Oracle Database Vault。

0
魔力猫
魔力猫

俩字,花钱。你这样的规则需求,需要额外的功能来保护数据安全。如果认为这些数据价格值这么多钱,那就付钱吧。Oracle Database提供了大量额外付费的扩展产品用来完善各种合规的数据安全访问需求,唯一需要你付出的就是小钱钱。

只要小钱钱到位,你这些需求完全没问题。

0
m
manabout

有解决方案吗?我这边实现的方案是加注解,因为无论怎么动态,SQL是不变的,所以在dao中加注解就可以了。不过对业务有侵入,需要提前了解要对哪些字段做过滤,还需要把过滤条件相关字段从子查询中挪到外层。这个方案对特殊的查询可能会失效,比如在子查询中分组聚合,过滤字段非聚合字段,这种情况就无能为力了。现在用antlr做SQL解析,这个可能是唯一的办法了。

 

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部