在提交之前更改 Oracle SQL 查询文本 [关闭]
Posted
技术标签:
【中文标题】在提交之前更改 Oracle SQL 查询文本 [关闭]【英文标题】:Change Oracle SQL Query Text before submission [closed] 【发布时间】:2012-10-18 01:49:21 【问题描述】:是否有高级 oracle 功能可以在 SQL 查询提交到 oracle 之前对其进行修改?或者可能是修改结果集?基于一定的条件? Like 可能是基于提交查询的进程的名称?还是基于查询文本?
场景是一个进程(用 C++ 编写)正在运行一个查询,而我们没有办法更改 C++ 代码。该流程中的特定业务验证失败,为了使验证不会失败,我想要一种方法来操作返回的数据集或在将选择查询提交到 oracle 引擎之前对其进行操作。
C++ 代码正在运行这个精确的查询
从 A_HDR 中选择 PL_ID,其中 ENT_NBR=''
我想更改它,以便 ORACLE 总是看到并执行以下查询
SELECT NULL FROM A_HDR WHERE ENT_NBR=''
请指导
【问题讨论】:
您需要更具体地说明您要解决的问题。你到底想改变什么,如何改变? 问题是业务流程未能通过验证。该过程是用 C++ 编写的,由于供应商已经消失,我们无法更改 C++ 代码。现在为了使验证不会失败,我想要一种方法来操作返回的数据集或在将选择查询提交到 oracle 引擎之前对其进行操作。我知道这是一个很长的路要走,但我正在努力寻找出路。 还是太模糊了。当我说“更具体”时,我指的是实际的代码示例,例如类似于“C++ 代码正在尝试运行此查询SELECT a FROM b WHERE c
,我想将其更改为 ...?...
”
C++ 代码正在运行此查询... SELECT PL_ID FROM A_HDR WHERE ENT_NBR='A_HDR
来处理此问题,该同义词指向 A_HDR
表上的视图,返回 NULL
而不是 PL_ID
。
【参考方案1】:
Oracle Virtual Private Database 可能就是您要找的。来自手册:
Oracle 虚拟专用数据库 (VPD) 使您能够创建安全性 在行和列级别控制数据库访问的策略。 本质上,Oracle 虚拟私有数据库添加了一个动态的 WHERE 对针对表、视图或 Oracle 虚拟私有数据库安全策略的同义词 已应用。
您或许可以从SYS_CONTEXT 获取流程和查询文本。例如,sys_context('userenv', 'current_sql')
和 sys_context('userenv', 'module')
。您可能还需要使用GV$SESSION
来获取更多信息。
但是,我认为您应该尽可能避免使用 VPD。在后台静默转换所有 SQL 语句是非常混乱的。它会使开发和故障排除变得非常困难。
更新
Oracle 12c 中的SQL Translation Framework 特性可能是解决这个问题的最佳方案。
【讨论】:
谢谢琼斯...SYS_CONTEXT 对我来说是一个新信息,它将帮助我在我的应用程序中继续前进。 我被禁止在 *** 上提出更多问题,因为我收到了关于这个问题的所有否定意见。当我以最好的方式提出或打算提出这个问题时,我真诚地觉得这对我来说有点苛刻。从那以后,我已经提供了所有合乎逻辑的细节,我请求你们帮我解除禁令。 @Guddu 我很惊讶你被禁止了。你的一些问题有一些问题,但这并不罕见。很抱歉,我可能是问题的一部分;我对你的一个问题投了反对票,但你后来更新了这个问题并解决了这个问题。几天前我删除了反对票,希望这能解除你的禁令吗?如果没有,我想你应该在 Meta 上寻求建议。我也投票决定重新打开,但我从未见过任何问题被重新打开。 @Guddu 这个问题还没有解决吗?如果是这样,请随时不接受我的回答。对于更新的版本,我的答案似乎不再正确。也许涉及一些以前的 cmets 的解决方案会更好。以上是关于在提交之前更改 Oracle SQL 查询文本 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 COMMIT 之前查看不同 SQL Oracle 会话的更改?
在 SQLAlchemy 中,如何在提交之前预览 SQL 语句以进行调试?