2012-03-08 5 views
2

AVC 테이블을 쿼리 할 때 갑자기이 오류가 발생하기 시작했습니다.ORA-04045 : 재 컴파일/재확인 중 오류

ORA-04045: errors during recompilation/revalidation of PUBLIC.AVC 
ORA-04098: trigger 'TTMS.ALTERED_TTMSDB_TABS_TRIGGER' is invalid and failed re-validation 

select * from avc 나던 작업 하지만 select * from exfc.avc이 작업을 수행합니다.

아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있습니까?

답변

3

아마도 스키마에 AVC이라는 개체가 없습니다. 따라서 스키마 한정자없이 AVC을 참조하면 해당 이름을 가진 PUBLIC 개체에 액세스합니다. 어떤 종류의 물체인지 확인하려면 SELECT object_type FROM all_objects WHERE object_name='AVC' AND owner='PUBLIC'.

무엇이든간에 쿼리하는 것은 어떤 이유로 트리거가 실행되는 것입니다. 어쩌면 이것은 일종의 감사 기능 일 것입니다. 그러나 현재 트리거가 유효하지 않습니다. 이는 누군가가 트리거 자체를 수정했지만 오류가 발생했을 수 있음을 의미합니다. 트리거 코드가 더 이상 유효하지 않은 방식으로 누군가가 트리거가 의존하는 다른 오브젝트를 삭제하거나 수정했음을 의미 할 수 있습니다.

그래서 트리거에 대한 응답은 컴파일에서 발생한 오류를 찾아 해결해야합니다.

EXFC.AVC을 명시 적으로 쿼리하면 PUBLIC 개체를 우회하여 실제 개체 테이블 (실제로는 실제 테이블)로 직접 이동합니다. 공개 동의어를 통한 라우팅 라우팅 액세스의 전체 지점이 대개 객체에 대한 직접 액세스를 방지하기 때문에 일반적으로이 액세스 권한은 매우 이상하게 보입니다. 실제로 트리거의 목적이 테이블에 대한 액세스를 감사하는 것이라면 완전히 무시할 수 있도록 허용하는 것이 매우 큰 디자인 결함입니다.

+1

+1하지만이 선택은 필수입니다. 공용 동의어는 "직접 액세스를 막을 수 없습니다."는 코드에서 스키마 이름을 하드 코딩하거나 피할 수있는 방법 일 뿐이지 만 사용을 허용합니다. 다른 이름. –

0

예, 기본적으로 언급 된 트리거에 오류가 있음을 알립니다. SQL 개발자가 작업 한 이래로이 문제를 해결할 수있는 가장 쉬운 방법은

'트리거'탭을 열고이 트리거를 검색하십시오. 이를 컴파일하고 조회를 다시 실행하십시오. 완벽하게 잘 작동합니다.