단일 트랜잭션에서 테이블에 대한 삽입 및 삭제 작업을 수행하고 있습니다.이 테이블에서 로그를 업데이트하는 트리거가 있습니다. 로그에는 항상 primaryId가있는 sequenceId가 있습니다 삽입시 증가합니다. 먼저 삭제하고 트랜잭션에 삽입합니다. 삽입에 대한 로그에오라클의 단일 트랜잭션에서 서로 다른 DML 쿼리에 대한 다른 타임 스탬프
- 타임 스탬프와 동일한되고있는 삭제 :
나는 두 가지 문제가 있습니다. 강제로 다른 수 있습니다.
- 로그에서 작업 (삽입/삭제) 순서가 바뀌고 있습니다. 그것은 삽입 작업 (sequenceId에 따라) 이후에 오는 삭제 작업을 보여줍니다. 주문이 로그에서 일관성을 유지하려면 어떻게해야합니까 (삭제 후 삽입).
예 :
create table address (ID number, COUNTRY char(2));
create table address_log(SEQ_ID number, ID number, COUNTRY char(2), DML_TYPE char(1), CHANGE_DATE timestamp(6));
create sequence seq_id start with 1 increment by 100 nominvalue nomaxvalue cache 20 noorder;
create or replace trigger trg_add
before insert or delete on address
FOR EACH ROW
BEGIN
if inserting then
insert into address_log values(SEQ_ID.nextval, :new.ID, :new.COUNTRY, 'I', sysdate);
else
insert into address_log values(SEQ_ID.nextval, :old.ID, :old.COUNTRY, 'D', sysdate);
end if;
end;
insert into address values(1,'US');
insert into address values(2,'CA');
delete from address where id = 1;
insert into address values(3,'UK');
delete from address where id = 3;
내가 단일 트랜잭션에서 마지막 DML 쿼리를 커밋 있다면, 내가 address_log에서 같은 순서를 볼 수 있습니다.
@ wolφi 나는 그것을 결정하기 위해 로그의 기본 키 sequenceId를 사용한다. 항상 늘린다. 또한 질문을 업데이트했다. – rajsekhar
코드 예제를 보내 주셔서 감사합니다. 그래서 두 문제는 @ Vincent의 대답으로 해결되었습니다. 그렇지 않습니까? (힌트 : 당신이 그것을 받아들이면, 빈센트와 몇 점을 얻을 것이다 ...) –