【发布时间】:2020-04-12 04:38:27
【问题描述】:
我有TABLE_1,这是这些记录的父表,位于SCHEMA_1 中,并在事务中从 JAVA/Node.js 应用程序填充。
在同一 SCHEMA_1 上也有以下触发器 (SCHEMA_1.TRIGGER_CALL_SP_OF_SCHEMA_2) 并调用另一个存储过程以填充到另一个 TABLE_2,它基于 Table_1 事务在 SCHEMA_2 中。
触发器:
create or replace trigger SCHEMA_1.TRIGGER_CALL_SP_OF_SCHEMA_2
AFTER UPDATE OR INSERT OR DELETE ON SCHEMA_1.TABLE_1
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SCHEMA_2.SP_OF_SCHEMA_2(:NEW.RECORD_ID);
commit;
EXCEPTION WHEN OTHERS THEN
RAISE;
END;
存储过程:
create or replace PROCEDURE SCHEMA_2.SP_OF_SCHEMA_2(P_RECORD_ID NUMBER ) AS
BEGIN
DELETE FROM SCHEMA_2.TABLE_2 WHERE RECORD_ID = P_RECORD_ID;
FOR rec IN (SELECT RECORD_ID, COL2, COL3, COL4 from SCHEMA_1.TABLE_1 where RECORD_ID = P_RECORD_ID)
LOOP
INSERT INTO SCHEMA_2.TABLE_2 (RECORD_ID, COL2, COL3, COL4) VALUES(rec.RECORD_ID, rec.COL2, rec.COL3,rec.COL4 );
END LOOP;
COMMIT;
END;
所以问题出在Table_2,它并不总是有最新记录。
例如:当第一个 record_Id 插入 Table_1 但在 Table_2 中没有任何条目时。
当第二次插入相同的 records_id 并在 Table_1 中插入另一个值时,但在 Table_2 中只有最后一个 record_id 并插入了详细信息。(同样不是最新条目)。以下是记录示例:(注意 - 两个表中都没有可用的任何 PK。)
表_1
+------------+-------+----------+---------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+---------+
| 1 | 101 | abc | insert |
+------------+-------+----------+---------+
表_2
+------------+-------+----------+------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+------+
表_1
+------------+-------+----------+---------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+---------+
| 1 | 101 | abc | insert |
| 1 | 102 | xyz | insert |
+------------+-------+----------+---------+
表_2
+------------+-------+----------+---------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+---------+
| 1 | 101 | abc | insert |
+------------+-------+----------+---------+
这是任何数据库提交序列或任何事务相关问题或任何其他可能的情况的b'cze?如何实现这一点以保持 Table_2 始终更新。 提前致谢。
【问题讨论】:
-
您的程序循环遍历(SELECT RECORD_ID, COL2, COL3, COL4 from SCHEMA_1.TABLE_1 where RECORD_ID = P_RECORD_ID),您确定这会返回任何值吗?
-
既不在触发器中也不在过程中使用
commit。这可能是对事务完整性的过度杀伤。
标签: oracle stored-procedures database-trigger