我有一个名为“ CUSTOMERS ”的架构。在此架构中,有一个名为 RECEIVABLES 的表。
还有另一种称为“ ACCOUNTS ”的架构。在此架构中,有一个名为 RECEIVABLES_AC 的表。
RECEIVABLES_AC有一个名为RECEIVABLES的公共synoym。 两个表的表结构完全相同。
如果您的前端使用客户架构凭据建立连接,那么如何确保在不更改前端代码的情况下将记录插入RECEIVABLES_AC。
我认为这是一个棘手的问题。如果没有在CUSTOMERS模式中重命名表RECEIVABLES,我不知道如何做到这一点。
答案 0 :(得分:2)
我能想到的唯一方法(不更改login或insert语句)是使用在登录时运行的数据库触发器并将当前架构更改为ACCOUNTS:
create or replace trigger logon_set_schema
AFTER LOGON ON DATABASE
BEGIN
if sys_context('USERENV','SESSION_USER') = 'CUSTOMERS' then
execute immediate 'alter session set current_schema=accounts';
end if
END;
/
但是,这可能会破坏代码的其他方面,因此更改应用程序以指定模式名称将是非常可取的。
答案 1 :(得分:0)
未指定的是该行为应该是替代还是补充。
使用ACCOUNTS.RECEIVABLES
上的复制将DML传播到CUSTOMER.RECEIVABLES_AC
。触发器,流,你有什么。
使用ALTER SESSION SET CURRENT_SCHEMA
语句更改用户会话的默认命名空间。
正确的回应方式是修复设计,并且没有浮动公共模式的多个应收款表。
答案 2 :(得分:0)
解决这个问题的两个好方法是:
选项1
CUSTOMERS.RECEIVABLES
。选项2
我更喜欢选项2.私有同义词是控制特定模式使用哪些表的好方法,而不必在应用程序中对模式名称进行硬编码。