我有TABLE_1
,这些记录的父表位于SCHEMA_1
中,并在交易时从JAVA / Node.js应用程序填充。在同一(SCHEMA_1.TRIGGER_CALL_SP_OF_SCHEMA_2)
上还具有以下触发器SCHEMA_1
,并根据表_1事务调用另一个存储过程来填充到TABLE_2
中的另一个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在表_1中插入另一个值,但在表_2中仅插入最后一个具有详细信息的record_id时(同样不是最新条目)。以下是记录示例:(注意-两个表中均未提供任何PK。)
Table_1
+------------+-------+----------+---------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+---------+
| 1 | 101 | abc | insert |
+------------+-------+----------+---------+
Table_2
+------------+-------+----------+------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+------+
Table_1
+------------+-------+----------+---------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+---------+
| 1 | 101 | abc | insert |
| 1 | 102 | xyz | insert |
+------------+-------+----------+---------+
Table_2
+------------+-------+----------+---------+
| RECORD_ID | COL2 | COL3 | COL4 |
+------------+-------+----------+---------+
| 1 | 101 | abc | insert |
+------------+-------+----------+---------+
这是否是任何数据库提交序列或任何与事务相关的问题或任何其他可能的情况?如何做到这一点以保持Table_2始终更新。在此先感谢。
触发器具有自主事务。
因此,触发触发器的插入/更新/删除与触发器中的过程调用在单独的事务中进行。
事务只能查看其他人的committed更改。
所以触发器中的事务看不到您插入的行!
create table t1 (
c1 int
);
create table t2 (
c1 int
);
create or replace trigger trig
after insert on t1
for each row
declare
pragma autonomous_transaction;
begin
insert into t2
select * from t1
where c1 = :new.c1;
dbms_output.put_line ( 'Rows added: ' || sql%rowcount );
commit;
end;
/
insert into t1 values ( 1 );
Rows added: 0
commit;
insert into t1 values ( 1 );
Rows added: 1
select * from t2;
C1
----------
1
由于在没有自主事务的情况下引用table_1
,将引发变异触发错误(ORA-04091),您需要重新考虑此过程。