如何查找Oracle Database应用搜索表单后台执行的SQL查询?
查找应用搜索表单对应的SQL查询方法
SQL的存储位置
SQL的存储位置完全看应用设计:
- 要是应用用了预定义的SQL或存储逻辑,可能存在这几个地方:数据库里的存储过程、函数、视图、包;或者直接硬编码在应用代码(比如Java的JDBC语句、Python的查询字符串);也可能存在应用的配置文件里。
- 要是用了ORM框架(比如Hibernate、MyBatis),要么是框架动态生成的SQL,要么是在XML配置或代码注解里定义的。
用SQL Developer从数据库端查找的实用方法
既然你没法碰应用代码,只能从数据库下手,给你几个实际能用的方法:
1. 实时监控会话SQL
打开SQL Developer的会话面板(顶部菜单View → Sessions),找到应用连接数据库的会话(可以通过数据库用户名、程序名筛选,比如你知道应用用的DB账号)。选中这个会话右键,选查看SQL或者监控会话,这时候操作应用的搜索表单,就能实时抓到执行的SQL语句。
2. 查询最近执行的SQL历史
Oracle自带视图能查最近跑过的SQL,直接执行这段语句:
SELECT sql_text, last_executed_time FROM v$sql WHERE lower(sql_text) LIKE '%你的搜索关键词%' -- 换成你搜索时用的唯一关键词,比如某个特定字段值 AND parsing_schema_name = '应用的DB用户名' -- 指定应用连接数据库用的账号 ORDER BY last_executed_time DESC;
注意:v$sql只存最近的SQL,操作完搜索表单赶紧查,不然可能被新的SQL冲掉。
3. 搜索数据库里的存储对象
如果SQL是封装在存储过程、函数或者包里的,用这段语句搜:
SELECT name, type, text FROM all_source WHERE lower(text) LIKE '%业务表名/字段名%' -- 换成你知道的相关业务表或字段 AND owner = '应用的DB用户名' ORDER BY name, line;
找到对应的存储对象后,查看它的代码就能找到查询逻辑。
4. 检查触发器
要是搜索操作会触发数据库触发器,也可以查一下:
SELECT trigger_name, triggering_event, table_name, trigger_body FROM all_triggers WHERE owner = '应用的DB用户名' AND lower(trigger_body) LIKE '%相关关键词%';
额外提醒
- 如果查
v$sql时提示权限不够,可以试着找外包商要SELECT_CATALOG_ROLE权限,或者让他们导出最近的SQL执行日志(如果他们有监控的话)。 - 操作搜索表单时尽量用独一无二的关键词,这样在结果里更容易定位到目标SQL,减少无关内容干扰。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

