2012-02-17 4 views
0

오라클의 테이블 변경에 문제가 있습니다. 두 테이블, CustomerPerson이 있습니다. Person 행을 수정하는 중에 ChangeDateCustomer에 업데이트해야하므로 트리거를 만들었습니다. 불행히도 Customer에 트리거가 발생하여 어떤 경우에는 Person을 업데이트하고 이로 인해 테이블 ​​변경 문제가 발생합니다. 다행히 Customer 변경으로 인해 변경된 경우 Person을 업데이트 할 때 Customer.ChangeDate을 업데이트 할 필요가 없습니다.트리거링 - 테이블 변경

여기 내 질문이 있습니다. Customer 트리거에 의해 Person 트리거가 실행되었음을 어떻게 확인할 수 있습니까?

+0

는'customer'은 * *을'changedate'가 수정되는 경우를 포함한다 person''업데이트 할 수있는 '어떤 경우를'수행 '사람이 직접 업데이트되는 경우 인 것 같다? 트리거와 두 테이블의 구조에 대한 코드를 게시하는 데 도움이 될 수 있습니다. –

+0

안녕하세요, Alex 님, 불행히도 월요일까지는 트리거 코드를 붙여 넣을 수 없지만'changedate '만 수정하면'person'이 업데이트되지 않습니다. –

답변

0
마지막으로

나는 커밋 후 삭제와 global temporary table을 사용 해요 :

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
    column1 NUMBER, 
    column2 NUMBER 
) ON COMMIT DELETE ROWS; 
4

돌연변이 테이블 오류는 거의 항상 데이터 모델 또는 관련 비즈니스 프로세스의 문제를 나타냅니다. 가장 일반적인 원인은 한 테이블의 데이터가 다른 테이블의 일부 형식으로 복제되는 비정규 화입니다. 이것은 여기에 해당하는 것으로 보입니다 - 귀하의 CUSTOMER 테이블이 PERSON이라는 다른 테이블에 대한 메타 데이터를 보유하고 있습니다. 그것만이 다른 방향으로 정보의 계단식으로 복잡해집니다.

이 상황을 해결하는 올바른 방법은 데이터 모델을 정렬하는 것입니다. 고객이 PERSON의 하위 유형입니까, 아니면 다른 방식입니까? 학부모와 아동을 결정하고 정보가 한 방향으로 만 흐르도록하십시오. 아마도 수퍼 유형에서 하위 유형으로 진행됩니다. 더 나은 해결책은 데이터 전파를 모두 제거하는 것입니다.

해결 방법이 있지만 변경 사항을 적용하기위한 패키지 및 기타 방법이 필요합니다.

0

@APC는 완전히 정확합니다.

나는 데이터 모델에 대한 수정을 협상 할 수 없었던 시대를 기억함으로써 약간 타협 할 것입니다. 이 경우 하나의 트리거에 대해 패키지 내부의 변수를 사용하여 다른 변수에 신호를 보낼 수 있습니다.

트리거 실행 절에 WHEN 조건을 넣을 수도 있습니다.

마지막으로 실제 해커 인 것처럼 느끼면 PL/SQL 호출 스택을 조사하여 다른 트리거를 찾아 볼 수 있습니다.