Oracle 데이터베이스에서 (최대 1000000 개까지) sql 문을 실행해야합니다. 이러한 명령문은 결과적으로 일관성있는 상태를 가져야하며 오류가 발생하면 모든 명령문을 롤백해야합니다. 이 진술은 참조 순서가 아닙니다. 따라서 외래 키 제약 조건이 활성화 된 경우 문 중 하나가 외래 키 위반을 유발할 수 있습니다.이 위반은 나중에 실행될 문으로 수정됩니다.자율 트랜잭션의 Oracle DDL
먼저 외래 키를 사용하지 않도록 설정하고 모든 문이 실행 된 후에 사용하도록 설정했습니다. 실제 외래 키 위반이 있었을 때 롤백 할 수있을 것이라고 생각했습니다. 그러나 나는 오라클의 모든 DDL 문이 커밋으로 시작 했으므로이 방법으로 문을 롤백 할 방법이 없다는 것을 알았습니다. 여기에 외부 키를 비활성화하는 내 스크립트입니다
begin
for i in (select constraint_name, table_name from user_constraints
where constraint_type ='R' and status = 'ENABLED')
LOOP execute immediate 'alter table '||i.table_name||' disable constraint
'||i.constraint_name||'';
end loop;
end;
몇 가지 조사 후, 나는 그것이 자율 트랜잭션에서,이 경우처럼, DDL 문을 실행하는 것이 좋습니다 것을 발견했다. 그래서 자율 트랜잭션에서 DDL 문을 실행하려고했습니다. NOWAIT가 나는 주요 트랜잭션이 여전히 테이블에 대한 DDL 잠금을 가지고 있기 때문에이 추측하고
을 지정 바쁜 자원 및 취득 :
ORA-00054 :이 다음과 같은 오류가 발생했습니다.
여기에 뭔가 잘못하고 있습니까? 아니면이 시나리오를 작동시키는 다른 방법이 있습니까?
"SET CONSTRAINTS"트릭에 대해 알아 냈고 여기에 나와 내 질문에 답변했습니다. 나는 대답을 보았습니다 :). 고맙습니다. – swamplord