2013-07-26 4 views
2

질문에서와 같이 - 업데이트가 트리거에서 참조 된 열을 완전히 생략 할 경우 어떤 값을 :new으로 가져 옵니까?오라클 트리거 - 가치는 무엇입니까?

DATE 값을 가진 :new 필드를 허용하는 함수를 사용하는 업데이트시 트리거를 발생시키는 저장 프로 시저를 디버깅하려고합니다. 그러나 실행중인 업데이트가 참조 된 열을 업데이트하지 않습니다.

트리거가 업데이트가 실행되는 테이블에 저장된 값을 사용합니까? 아니면 다른 곳에서 가져갈 것인가?

+0

그 밖의 데이터베이스에서 값을 얻을 수 있다고 생각되는 곳이 있습니까? – APC

+0

나는 PL/SQL에 대해 매우 익숙해 져서 아무 일도 일어나지 않을 것 같아요. 오라클의 간단한 논리를 따르는 것은 아니지만 어제 저는 TO_DATE를 날짜 열에 호출하기 때문에 다소 어려움을 겪었습니다 :) – kyooryu

+0

글쎄, "무엇이든"을 기대하십시오. 오라클 데이터베이스 트랜잭션은 트리거가 있어도 예측할 수 있습니다. 나중에 오라클이 예측할 수없는 바보 같은 트리거를 코딩 할 때 일어나는 일이 바로 "돌연변이 테이블"예외를 발견하게 될 것입니다. – APC

답변

5

업데이트 구문에서 열을 생략하면 :NEW.column 값은 :OLD.column 값과 같습니다. 그리고 그 업데이트 한 Statment가

5

이것에 대해 documentation is not entirely clear하지만 :NEW:OLD을 실행하기 전에 테이블에 저장된 값이 현재 행의 버전을 나타냅니다이다.

따라서 :NEW.col23은 새 행 버전의 해당 열 값을 나타냅니다. 트랜잭션이 해당 열의 값을 변경하지 않은 경우 :OLD.col23과 같습니다. 실제로 우리는 트리거에서 코드의 테스트를 코딩하여 업데이트로 인해 열의 값이 변경되었는지 여부를 확인할 수 있습니다.

if :NEW.col23 = :OLD.col23 then 
    -- value not changed