在提交之前更改 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=''....我想更改它,以便 ORACLE 始终看到执行 SELECT NULL FROM A_HDR WHERE ENT_NBR='' 代替...... 在这种情况下,VPD 将无法为您提供帮助。您可以通过创建同义词 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 语句以进行调试?

具有更改查询的 Oracle SQL Tuning Advisor

在关闭pl/sql之前未提交的事物,会不会被默认提交?

如何在 PL-SQL 上更改之前获取视图/触发器?

在 SQL 查询中使用文本字段值而不提交它