【问题标题】:Update and Delete Oracle Trigger更新和删除 Oracle 触发器
【发布时间】:2013-03-02 20:25:15
【问题描述】:

几天前发布了一个问题,并成功让我的触发器工作! 但是遇到了一些新问题。

我有两张桌子:

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;

Insert 在表格中正常工作。但是,当我更新 ASSESSMENT 表时,新行是 插入ASSESSMENT_ANNOUNCEMENT 表中 - 它没有更新。

ASSESSMENT 表中删除会从ASSESSMENT 表中删除行,但不会从表中删除条目 ASSESSMENT_ANNOUNCEMENT 表。

任何帮助和/或指导都会很棒!

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    如果您想更新或删除ASSESSMENT_ANNOUNCEMENT 中的一行,您应该使用updatedelete 语句显式执行此操作。
    在触发器中使用以下结构:

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

    【讨论】:

    • 还要注意 DELETE,:NEW.DEADLINE_DATE 值将为 NULL。
    【解决方案2】:

    只是为了给你一个完整的样本

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

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多