是否有高级 Oracle 功能可以在将 SQL 查询提交给 Oracle 之前对其进行修改?或者可能会修改结果集?基于一定的条件?就像可能基于提交查询的进程的名称?或者基于查询文本?
场景是一个进程(用 C++ 编写)正在运行查询,而我们没有办法更改 C++ 代码。该流程中的特定业务验证失败,为了使验证不会失败,我想要一种方法来操作返回的数据集或在提交到 Oracle 引擎之前操作选择查询。
C++ 代码正在运行这个确切的查询
从 A_HDR WHERE ENT_NBR='' 中选择 PL_ID
我想更改它,以便 ORACLE 始终看到并执行以下查询
从 A_HDR WHERE ENT_NBR='' 中选择 NULL
请指导
最佳答案
Oracle Virtual Private Database可能就是您正在寻找的。来自手册:
Oracle Virtual Private Database (VPD) enables you to create security policies to control database access at the row and column level. Essentially, Oracle Virtual Private Database adds a dynamic WHERE clause to a SQL statement that is issued against the table, view, or synonym to which an Oracle Virtual Private Database security policy was applied.
您也许可以从 SYS_CONTEXT 获取流程和查询文本。例如,sys_context('userenv', 'current_sql')
和 sys_context('userenv', 'module')
。您可能还需要使用 GV$SESSION
来获取更多信息。
但是,我认为您应该尽可能避免 VPD。让所有 SQL 语句在后台默默转换是极其令人困惑的。它会使开发和故障排除变得非常困难。
更新
SQL Translation Framework Oracle 12c 中的功能可能是解决此问题的最佳解决方案。
关于oracle - 提交前更改 Oracle SQL 查询文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945957/