【发布时间】:2020-03-31 16:40:42
【问题描述】:
我有两个后端系统(旧的和新的)共享一个 Oracle 数据库。
在旧系统中,为了保存客户数据,有两个表
customers_A
ID NAME ETC
1 PETE ....
customers_B
ID NAME ETC
1 JOSH ...
2 ROSS ...
在新系统中,我创建了一个名为 All_Costumer 的新表,用于连接这些表。 这个新表分别包含类型 A 和 B 的客户 ID。
All_Customers
ID ID_CUSTOMER_A ID_CUSTOMER_B
A19E----D2B0 1 null
A19E----D2B1 null 1
A19E----D2B2 null 2
因此,当新系统创建 A 类型的新客户时,数据将插入到 customer_A 和 All_Customers 表中,同时 B 类型的客户也将插入。 p>
目前,旧系统也在工作,当创建A类型的新客户时,数据仅插入customer_A表,但我也需要All_Customers中的数据。
为了解决这个问题,我创建了一个内部带有 MERGE INTO 语句的 TRIGGER,如果此表上不存在该行(当旧系统创建 A 类型的新客户时),则在 All_Customers 中插入一行
CREATE OR REPLACE TRIGGER customers_trg
AFTER INSERT
ON customer_A
FOR EACH ROW
DECLARE
variables that doesn't matters
BEGIN
MERGE INTO all_customers
USING (SELECT :new.id id FROM customer_A where id = :new.id) customer
ON (all_customers.id_customer_a = customer.id)
WHEN NOT MATCHED THEN
INSERT (id, id_customer_a)
VALUES (SYS_GUID(), :new.id, null);
COMMIT;
END;
但是当我尝试从旧系统创建新客户时,我收到此错误:
ORA-04091: table **customer_A** is mutating, trigger/function may not see it
有办法解决这个问题吗?
我尝试在 DECLARE 部分添加PRAGMA AUTONOMOUS_TRANSACTION;,但没有成功。
注意:我不能修改旧系统
【问题讨论】:
标签: oracle plsql database-trigger