如何解析并改写 SQL

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

NGINX Sprint China 2022--NGINX年度旗舰盛会,已开启免费预约!>>>

我们公司有如下需求:

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

 

问题:

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

 

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

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

 

用的是 Hibernate ORM 持久框架。

 

加载中
0
CantosSong
CantosSong

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

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

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

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

#JSqlParser#

可以帮助你解析SQL,取 SELECT 类型的 statement

红薯官方
红薯官方
该评论暂时无法显示,详情咨询 QQ 群:点此入群
z
ztcwh
回复 @蓝水晶飞机 : 好的,谢谢。
红薯官方
红薯官方
该评论暂时无法显示,详情咨询 QQ 群:点此入群
红薯官方
红薯官方
回复 @ztcwh : 不好意思,因为我对 JSqlParser 并不熟,所以我希望你这个问题能自己花一天时间去学习研究,写几个Demo来试试样本SQL解析,然后了解如何使用,怎么解决自己的应用需求。我相信这个可能对你更有帮助。
z
ztcwh
回复 @蓝水晶飞机 : 再耽误兄弟一些时间,此组件能不能像 XML 组件那样,既可解析 XML,又能修改节点值及属性等操作。那么此组件能不能,既可解析 SQL ,又能修改 SQL 条件的操作?还是说,只能解析,然后要自己重新拼接 SQL 语句?
下一页
0
DeMoNHaDeS
DeMoNHaDeS

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

不知道能否满足你的需求

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

结合  http://liuguxing.iteye.com/blog/889448

做字典  

表名 table_name  改成替换成  (select * from table_name where xxxx = xx) t

z
ztcwh
要是我要控制 update 语句的话,会出现语法错误。例如: update orderTable set title=? where id=100 按照兄弟你的做法,会变成如下语句 update (select * from orderTable where userId=8) set title=? where id=100 这样就变成了语法错误。
z
ztcwh
这个方案已经想过了,不可行。例如: select * from orderTable where id=100 按照兄弟你的做法,会变成如下语句 select * from (select * from orderTable where userId=8) where id=100 如果查询数据达到了上百万,效率明显低好多。 兄弟,还有其他法子吗?
0
魔力猫
魔力猫

Oracle Database Vault。

0
魔力猫
魔力猫

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

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

魔力猫
魔力猫
该评论暂时无法显示,详情咨询 QQ 群:点此入群
z
ztcwh
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
MeiJM
MeiJM
在实体上加@where条件试试
z
ztcwh
不行哦,因为 where 条件不是固定的,会根据每个用户来添加,并不是所有的用户都共用一个 where 条件。
0
m
manabout

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

 

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