首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新和删除Oracle触发器

更新和删除Oracle触发器
EN

Stack Overflow用户
提问于 2013-03-03 04:25:15
回答 2查看 3K关注 0票数 1

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

我有两张表:

代码语言:javascript
复制
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
  )

我的触发器是:

代码语言:javascript
复制
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表中删除条目。

任何帮助和/或指导都是非常棒的!

EN

回答 2

Stack Overflow用户

发布于 2013-03-03 05:02:05

如果要更新或删除ASSESSMENT_ANNOUNCEMENT中的行,则应使用updatedelete语句显式完成。

在触发器中使用以下结构:

代码语言:javascript
复制
IF INSERTING THEN
  -- actions for inserting
ELSIF UPDATING THEN
  -- actions for updating
ELSE
  -- actions for deleting
END IF;
票数 1
EN

Stack Overflow用户

发布于 2013-03-03 15:12:35

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

代码语言:javascript
复制
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代码的大小,创建三个触发器可能会更清楚

代码语言:javascript
复制
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 ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15179073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档