2013-03-02 170 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 ...