首先,免责声明:这是用于测试/开发场景,而不是用于生产。有没有一种方法可以拦截一个选择查询,并为一个特定的字段添加一些值到响应中?呼叫应用程序是不同的,我希望我们不必改变他们的逻辑。此外,由于这是我们正在评估的临时方案,我们不希望必须在数据库上运行更新。我正在考虑触发器,但我看不到任何工作在选择级别。
ru9i0ody1#
在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返回错误的值,所以要小心让每个人都知道到底发生了什么。
1条答案
按热度按时间ru9i0ody1#
在Oracle中有几种方法可以静默地更改查询的输出。使用包DBMS_ADVANCED_REWRITE,您可以将值附加到现有值,尽管您必须为要修改的每个语句创建重写等价。例如,下面的查询最初返回名称“Jon”,但在创建重写等价之后,同一查询返回名称“Jon TEST!"。
不用说,创建这些重写等价物可能是一种邪恶,可能会让人发疯。你实际上是在告诉Oracle返回错误的值,所以要小心让每个人都知道到底发生了什么。