如何在应用程序中校验所有SQL表达式以排查引用等错误
应用内无效表引用SQL批量校验定位方案
以下是可落地的全量校验操作步骤,可覆盖内置Advisor漏检的场景(比如你遇到的SAMPLE$PROJECT_TASKS未识别问题):
- 导出应用完整元数据
进入应用导出界面,选择导出为单个SQL文件,导出的文件会包含所有页面内容、组件配置、自定义SQL、校验逻辑、计算规则的全部底层定义。 - 全量提取SQL表达式
两种实现方式可选:- 用本地文本编辑器打开导出的元数据文件,用正则匹配提取所有
SELECT/INSERT/UPDATE/DELETE开头的SQL代码块 - 直接查询当前环境的APEX元数据表,拉取所有业务写的SQL片段,涉及的系统表包括
APEX_APPLICATION_PAGE_REGIONS(区域查询SQL)、APEX_APPLICATION_PAGE_PROCESS(页面处理逻辑SQL)、APEX_APPLICATION_COMPUTATIONS(应用级计算SQL)、APEX_APPLICATION_VALIDATIONS(校验规则SQL)
- 用本地文本编辑器打开导出的元数据文件,用正则匹配提取所有
- 批量校验表名有效性
先执行以下SQL获取当前Schema下所有存在的表和视图清单:SELECT TABLE_NAME AS OBJECT_NAME FROM USER_TABLES UNION ALL SELECT VIEW_NAME AS OBJECT_NAME FROM USER_VIEWS
将提取到的所有SQL片段中的表名和上述清单做比对,不在清单内的就是无效引用的表名。 - 精确定位问题位置
确认无效表名后,直接通过元数据表查询关联的页面、组件信息,示例查询代码如下,将SAMPLE$PROJECT_TASKS替换为你要排查的无效表名即可:
查询结果会直接返回问题SQL所在的页面ID、组件名称,不需要手动逐个页面排查。SELECT '页面区域' AS COMPONENT_TYPE, PAGE_ID, PAGE_NAME, REGION_NAME AS COMPONENT_NAME, SQL_QUERY AS PROBLEM_SQL FROM APEX_APPLICATION_PAGE_REGIONS WHERE UPPER(SQL_QUERY) LIKE '%SAMPLE$PROJECT_TASKS%' UNION ALL SELECT '页面处理逻辑' AS COMPONENT_TYPE, PAGE_ID, PAGE_NAME, PROCESS_NAME AS COMPONENT_NAME, PROCESS_TEXT AS PROBLEM_SQL FROM APEX_APPLICATION_PAGE_PROCESSES WHERE UPPER(PROCESS_TEXT) LIKE '%SAMPLE$PROJECT_TASKS%' UNION ALL SELECT '应用级计算' AS COMPONENT_TYPE, PAGE_ID, PAGE_NAME, COMPUTATION_NAME AS COMPONENT_NAME, COMPUTATION AS PROBLEM_SQL FROM APEX_APPLICATION_COMPUTATIONS WHERE UPPER(COMPUTATION) LIKE '%SAMPLE$PROJECT_TASKS%'
补充说明:内置Advisor漏检的核心原因是默认只会扫描启用状态的组件,且不会识别包含绑定变量、替换字符串动态拼接生成的表名,上述方案可覆盖所有状态的组件,且不受动态拼接逻辑影响。
内容的提问来源于stack exchange,提问作者MarekChr
相关产品推荐
相关产品推荐

