首先,免责声明:这是用于测试/开发场景,而不是用于生产使用。
是否有一种方法来拦截一个选择查询,并为一个特定的字段追加一些值的响应?
呼叫应用程序是不同的,我希望我们不必改变他们的逻辑。
由于这是临时的场景,我们正在评估,我们不想在数据库上运行更新。
我正在考虑触发器,但我看不到任何在选择级别工作的触发器。
在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返回错误的值,所以要小心让每个人都确切地知道发生了什么。