是否有在数据库级别编辑sql响应/结果的方法



首先,免责声明:这是用于测试/开发场景,而不是用于生产使用。

是否有一种方法来拦截一个选择查询,并为一个特定的字段追加一些值的响应?

呼叫应用程序是不同的,我希望我们不必改变他们的逻辑。

由于这是临时的场景,我们正在评估,我们不想在数据库上运行更新。

我正在考虑触发器,但我看不到任何在选择级别工作的触发器。

在Oracle中有几种方法可以静默地更改查询的输出。使用包DBMS_ADVANCED_REWRITE,您可以向现有值追加值,尽管您必须为想要修改的每个语句创建重写对等体。例如,下面的查询最初返回名称"Jon",但在创建重写等价之后,相同的查询返回名称"Jon TEST!"

SYS> create table test1(name varchar2(20));
Table created.
SYS> insert into test1 values('Jon');
1 row created.
SYS> commit;
Commit complete.
SYS> select name from test1;
NAME
--------------------
Jon
1 row selected.
SYS> begin
2     sys.dbms_advanced_rewrite.declare_rewrite_equivalence
3     (
4         name             => 'REWRITE1',
5         source_stmt      => q'[select name from test1]',
6         destination_stmt => q'[select name || ' TEST!' name from test1]',
7         validate         => false,
8         rewrite_mode     => 'GENERAL'
9     );
10  end;
11  /
PL/SQL procedure successfully completed.
SYS> alter session set query_rewrite_integrity = trusted;
Session altered.
SYS> select name from test1;
NAME
--------------------------
Jon TEST!
1 row selected.

不用说,创建这些重写等价物可能有点邪恶,可能会让人发疯。你实际上是在告诉Oracle返回错误的值,所以要小心让每个人都确切地知道发生了什么。

最新更新