2016-06-04 3 views
1

트리거를 실행할 때마다 ORA-04091 오류 (트리거 (또는 함수)가 해당 테이블을 읽지 않도록 다시 작성하십시오)가 표시됩니다. ,오라클 - 트리거를 다시 작성하십시오.

create or replace TRIGGER comment_date_trigger 
BEFORE INSERT OR UPDATE 
ON "comment" 
FOR EACH ROW 
DECLARE 
    date_article TIMESTAMP; 
    date_parent TIMESTAMP; 
BEGIN 
    IF :NEW."comment_parent_id" IS NOT NULL THEN 
     SELECT "comment_date" INTO date_parent FROM "comment_view" WHERE "comment_id" = :NEW."comment_parent_id"; 
    END IF; 
    SELECT "article_date" INTO date_article FROM "article" WHERE "article_id" = :NEW."comment_article_id"; 
    IF :NEW."comment_date" > SYSTIMESTAMP THEN 
     RAISE_APPLICATION_ERROR(-20003, '...'); 
    ELSIF :NEW."comment_date" < date_article THEN 
     RAISE_APPLICATION_ERROR(-20005, '...'); 
    ELSIF :NEW."comment_date" < date_parent THEN 
     RAISE_APPLICATION_ERROR(-20006, '...'); 
    END IF; 
END; 

이 문제를 해결하는 가장 쉬운 해결책은 무엇인가하십시오 여기

트리거입니까? 보시다시피 뷰를 사용하려고했지만 문제가 남아 있습니다.

감사합니다.

+0

삽입 * 업데이트 * * * 삽입 * 업데이트 * 전에 * 변경 한 경우 작동합니까? 다음과 같이 변경하지 않으므로 동일한 효과가 있어야합니다. new. 밸류에이션이 없으면 밸리데이션에 실패하면 트랜잭션을 롤백 할 것이다. –

+0

여전히 동일합니다. – KRiSTiN

답변

1

테이블이 수정 중이기 때문에 동일한 트리거 테이블에서 쿼리를 실행할 수 없습니다. 내가 아는 유일한 해결 방법

PRAGMA AUTONOMOUS_TRANSACTION으로 방아쇠를 선언하는 것입니다 :

create or replace TRIGGER comment_date_trigger 
BEFORE INSERT OR UPDATE ON comment 
FOR EACH ROW 
DECLARE 

    PRAGMA AUTONOMOUS_TRANSACTION; 

    date_article TIMESTAMP; 
    date_parent TIMESTAMP; 

BEGIN 

    IF :NEW.comment_parent_id IS NOT NULL THEN 
     SELECT comment_date INTO date_parent FROM comment_view WHERE comment_id = :NEW.comment_parent_id; 
    END IF; 

    SELECT article_date INTO date_article FROM article WHERE article_id = :NEW.comment_article_id; 

    IF :NEW.comment_date > SYSTIMESTAMP THEN 
     RAISE_APPLICATION_ERROR(-20003, '...'); 
    ELSIF :NEW.comment_date < date_article THEN 
     RAISE_APPLICATION_ERROR(-20005, '...'); 
    ELSIF :NEW.comment_date < date_parent THEN 
     RAISE_APPLICATION_ERROR(-20006, '...'); 
    END IF; 

END; 

프로그램의 이러한 종류의 간주됩니다 어쨌든 고려하시기 바랍니다 :이 트리거에 의해 실행 된 쿼리의 트리거를 트리거 트랜잭션을 해제합니다 나쁜 연습 : 좀 봐 Fix Oracle mutating trigger table errors

+1

그래, 나는 이미 정확히 같은 해결책을 약 5 분 전에 발견했다. 작동하는 것 같습니다. 고맙습니다. – KRiSTiN

관련 문제