记录首先插入哪里?

时间:2010-09-24 13:05:15

标签: oracle

我有一个名为“ CUSTOMERS ”的架构。在此架构中,有一个名为 RECEIVABLES 的表。

还有另一种称为“ ACCOUNTS ”的架构。在此架构中,有一个名为 RECEIVABLES_AC 的表。

RECEIVABLES_AC有一个名为RECEIVABLES的公共synoym。 两个表的表结构完全相同。

如果您的前端使用客户架构凭据建立连接,那么如何确保在不更改前端代码的情况下将记录插入RECEIVABLES_AC。

我认为这是一个棘手的问题。如果没有在CUSTOMERS模式中重命名表RECEIVABLES,我不知道如何做到这一点。

3 个答案:

答案 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)

未指定的是该行为应该是替代还是补充。

  1. 使用ACCOUNTS.RECEIVABLES上的复制将DML传播到CUSTOMER.RECEIVABLES_AC。触发器,流,你有什么。

  2. 使用ALTER SESSION SET CURRENT_SCHEMA语句更改用户会话的默认命名空间。

  3. 正确的回应方式是修复设计,并且没有浮动公共模式的多个应收款表。

答案 2 :(得分:0)

解决这个问题的两个好方法是:

选项1

  1. 重命名CUSTOMERS.RECEIVABLES
  2. 删除公共同义词。
  3. 在CUSTOMERS架构中创建一个私有同义词,名为RECEIVABLES,指向ACCOUNTS.RECEIVABLES_AC。
  4. 选项2

    1. 更改前端以引用RECEIVABLES_AC而不是RECEIVABLES。
    2. 在CUSTOMERS模式中创建一个私有同义词,名为RECEIVABLES_AC,指向ACCOUNTS.RECEIVABLES_AC。
    3. 我更喜欢选项2.私有同义词是控制特定模式使用哪些表的好方法,而不必在应用程序中对模式名称进行硬编码。