테이블 오류를 변경하는 원인과 해결책은 무엇입니까?


12

변형 테이블 오류는 디자인 결함이나 문제가있는 쿼리로 인해 발생한다는 것을 알고 있습니다.

최근에 변경 쿼리 오류가 발생하는 이전 쿼리가 프로덕션에 추가되었습니다. DBA가 문제를 해결했지만 방법을 모릅니다.

테이블 변경을 정확히 일으키는 원인은 무엇이며 DBA는 어떻게 문제를 해결 했습니까?

답변:


17

변경 테이블 오류의 가장 큰 원인은 트리거 오용입니다. 일반적인 예는 다음과 같습니다.

  1. 당신은 테이블 A에 행을 삽입
  2. 테이블 A의 트리거 (각 행에 대해)는 테이블 A에 대한 쿼리를 실행합니다 (예 : 요약 열 계산).
  3. Oracle에서 ORA-04091이 발생 함 : 테이블 A가 변경되고 트리거 / 함수가 표시되지 않을 수 있음

이것은 예상되는 정상적인 행동이며, 오라클은 다음을 보장하므로 오라클이 귀하를 보호하고자합니다.

  • (i) 각 진술이 원자 적이라는 것 (즉, 실패하거나 완전히 성공할 것)
  • (ii) 각 진술이 데이터에 대한 일관된 견해를 본다는 것

이러한 종류의 트리거를 작성할 때 쿼리 (2)가 (1)에 삽입 된 행을 보게 될 것입니다. 업데이트가 아직 완료되지 않았기 때문에 위의 두 지점과 모순됩니다 (더 많은 행을 삽입 할 수 있음).

오라클 진술 시작 직전에 특정 시점과 일치하는 결과를 반환 할 수 있지만 대부분의 예 에서이 논리를 구현하려고 시도하는 사람들은 여러 행 진술을 연속적인 단계의 세리로보고 이전 단계에서 변경 한 내용을 확인하려면 [2] 문을 실행하십시오. Oracle은 예상 결과를 반환 할 수 없으므로 오류가 발생합니다.

자세한 내용 은 Ask Tom의 "mutating table"을 참조하십시오 .

변경 테이블 오류의 원인이 트리거라고 생각되는 경우 오류를 피하는 한 가지 방법은 트리거의 논리를 프로 시저로 이동하는 것입니다.


9

돌연변이 표는 성명 화재 및 방아쇠 참조 트리거를 발생하는 테이블에 트리거가 발생하면 발생합니다. 이러한 문제를 피하는 가장 좋은 방법은 트리거를 사용하지 않는 것이지만 DBA가이를 수행하는 데 시간이 걸리지 않은 것 같습니다. 그는 다음 중 하나를 수행 할 수있었습니다.


1
적어도 나를 위해, 11.2.0.4.0에서 애프터 트리거로 변경되지 않음
소프트웨어 예언자

또한 나를 위해; 버전 12.1.0.2.0 및 AFTER가 작동하지 않습니다.
eidylon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.