2013-03-02 145 views
1

幾天前發佈了一個問題,併成功啓動了我的觸發器! 但有一些新的問題。更新和刪除Oracle觸發器

我有兩個表:

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表中的新行是 - 它未更新。

ASSESSMENT表中刪除將從ASSESSMENT表中刪除行,但從 表中刪除該行的ASSESSMENT_ANNOUNCEMENT表。

任何幫助和/或指導將是太棒了!

回答

1

如果要更新或刪除ASSESSMENT_ANNOUNCEMENT中的一行,應該使用updatedelete聲明明確地執行該操作。
使用以下建築在觸發:

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 2013-03-02 21:54:04

0

只給你一個完整的樣本

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; 

根據的PL/SQL代碼的真正的業務邏輯和大小,它可能會更清楚創建三個觸發器

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 ...