2013-03-02 4 views
1

게시 됨 질문 며칠 전 성공적으로 작동하도록 방아쇠를당했습니다! 하지만 몇 가지 새로운 문제가 있습니다.업데이트 및 삭제 오라클 트리거

CREATE TABLE "ASSESSMENT" 
    ( "ASSESSMENT_NAME" VARCHAR2(50) NOT NULL ENABLE, 
     "DEADLINE_DATE" DATE NOT NULL ENABLE, 
     CONSTRAINT "ASSESSMENT_PK" PRIMARY KEY ("ASSESSMENT_NAME") ENABLE 
) 

CREATE TABLE "ASSESSMENT_ANNOUNCEMENT" 
    ( "ASSESSMENT_NAME" VARCHAR2(50) NOT NULL ENABLE, 
     "DEADLINE_DATE" DATE NOT NULL ENABLE, 
     "ATTENTION" VARCHAR2(500) NOT NULL ENABLE, 
     CONSTRAINT "ASSESSMENT_ANNOUNCEMENT_PK" PRIMARY KEY ("ASSESSMENT_NAME") ENABLE 
) 

트리거 내가 가진 :

CREATE OR REPLACE TRIGGER "TEST" 
    AFTER INSERT OR UPDATE OR DELETE 
    ON ASSESSMENT 
FOR EACH ROW 
BEGIN 
    IF :new.DEADLINE_DATE >= SYSDATE - 7 
    THEN 
    INSERT INTO ASSESSMENT_ANNOUNCEMENT(ASSESSMENT_NAME, DEADLINE_DATE ,ATTENTION) 
     VALUES(:new.ASSESSMENT_NAME, :new.DEADLINE_DATE, 'DEADLINE IS 7 DAYS OR LESS!'); 
    END IF; 
END; 

삽입 테이블에 걸쳐 제대로 작동

나는 두 개의 테이블이있다. 그러나 ASSESSMENT 테이블에서 업데이트 할 때 새로운 행은 이 ASSESSMENT_ANNOUNCEMENT 테이블에 삽입되어 업데이트되지 않습니다. A는 ASSESSMENT 테이블에서 삭제

ASSESSMENT 테이블에서 행이 아닌 ASSESSMENT_ANNOUNCEMENT 테이블에서 항목을 제거합니다.

도움이나 안내가 환상적입니다!

답변

1

ASSESSMENT_ANNOUNCEMENT에서 행을 업데이트하거나 삭제하려면 update 또는 delete 문을 사용하여 명시 적으로 수행해야합니다. 좀 더 명확하게 할 수있다,

IF INSERTING THEN 
    -- actions for inserting 
ELSIF UPDATING THEN 
    -- actions for updating 
ELSE 
    -- actions for deleting 
END IF; 
+1

또한 DELETE에 유의하십시오. NEW.DEADLINE_DATE 값은 NULL입니다. – eaolson

0

그냥 PL/SQL 코드의 실제 비즈니스 로직 및 크기에 따라 당신에게 전체 샘플

CREATE OR REPLACE TRIGGER "TEST" 
    AFTER INSERT OR UPDATE OR DELETE 
    ON ASSESSMENT 
FOR EACH ROW 
BEGIN 
    IF INSERTING THEN 
     IF :new.DEADLINE_DATE >= SYSDATE - 7 
     THEN 
      INSERT INTO ASSESSMENT_ANNOUNCEMENT(ASSESSMENT_NAME, DEADLINE_DATE ,ATTENTION) 
      VALUES(:new.ASSESSMENT_NAME, :new.DEADLINE_DATE, 'DEADLINE IS 7 DAYS OR LESS!'); 
     END IF; 

    ELSIF UPDATING THEN 
     UPDATE ASSESSMENT_ANNOUNCEMENT SET 
      ASSESSMENT_NAME=:new.ASSESSMENT_NAME, 
      DEADLINE_DATE=:new.DEADLINE_DATE, 
      ATTENTION='Deadline Updated' 
     WHERE ASSESSMENT_NAME=:old.ASSESSMENT_NAME; 

    ELSE 
     DELETE ASSESSMENT_ANNOUNCEMENT 
     WHERE ASSESSMENT_NAME=:old.ASSESSMENT_NAME; 
    END IF; 
END; 

을 제공 :
는 트리거에 다음과 같은 구조를 사용하여 세 개의 트리거를 만들려면

CREATE OR REPLACE TRIGGER "TEST_AI_TRG" AFTER INSERT ON ASSESSMENT ... 
CREATE OR REPLACE TRIGGER "TEST_AU_TRG" AFTER UPDATE ON ASSESSMENT ... 
CREATE OR REPLACE TRIGGER "TEST_AD_TRG" AFTER DELETE ON ASSESSMENT ...