ORACLE 和触发器(插入、更新、删除)

Posted

技术标签:

【中文标题】ORACLE 和触发器(插入、更新、删除)【英文标题】:ORACLE and TRIGGERS (inserted, updated, deleted) 【发布时间】:2011-02-27 06:36:05 【问题描述】:

我想在表上使用触发器,每次插入、更新或删除行时都会触发该触发器。

我是这样写的:

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR DELETE OR UPDATE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00') 

它有效。 因为如果插入、更新或删除行,我想做同样的事情,我想知道触发器中发生了什么。 我想我可以设法找到该行是否被插入或更新(我可以用 new_buffer 检查 old_buffer)。 如何知道该行是否已被删除?

【问题讨论】:

【参考方案1】:

将其分成 2 个触发器。一个用于删除,一个用于插入\更新。

【讨论】:

谢谢,但我想知道如何识别操作。阿尔贝托 @LeftyX 这就是为什么你应该接受 devio 的回答,而不是 Tony Andrews。【参考方案2】:

来自Using Triggers:

检测触发的 DML 操作 触发器

如果有不止一种类型的 DML 操作 可以触发触发器(例如,ON 插入、删除或更新 Emp_tab),触发器主体可以使用 条件谓词插入, 删除和更新以检查哪个 触发触发器的语句类型。

所以

IF DELETING THEN ... END IF;

应该适用于您的情况。

【讨论】:

感谢您的回答。有用。我在删除方面遇到了一些问题。我想这不是造成这种情况 new_buffer.field1 = 'HBP00' 的原因。【参考方案3】:

新值(或您重命名的 NEW_BUFFER)仅在 INSERTING 和 UPDATING 时可用。对于 DELETING,您需要使用 OLD (OLD_BUFFER)。所以你的触发器会变成:

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR DELETE OR UPDATE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

您可能需要在触发器内添加逻辑,以适应将 field1 从“HBP000”更新为其他内容的代码。

【讨论】:

我在 10 分钟前就知道了 ;-) 谢谢。阿尔贝托【参考方案4】:

我已经像这样更改了我的代码并且它可以工作:

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR UPDATE OR DELETE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

DECLARE
      Operation       NUMBER;
      CustomerCode    CHAR(10 BYTE);
BEGIN

IF DELETING THEN 
  Operation := 3;
  CustomerCode := :old_buffer.field1;
END IF;

IF INSERTING THEN 
  Operation := 1;
  CustomerCode := :new_buffer.field1;
END IF;

IF UPDATING THEN 
  Operation := 2;
  CustomerCode := :new_buffer.field1;
END IF;    

// DO SOMETHING ...

EXCEPTION
    WHEN OTHERS THEN ErrorCode := SQLCODE;

END;

【讨论】:

以上是关于ORACLE 和触发器(插入、更新、删除)的主要内容,如果未能解决你的问题,请参考以下文章

插入或删除后的 Oracle 触发器

Oracle中的触发器是请求的一部分吗?

如何分离在 Oracle 中为特定表插入、更新和删除记录的过程

PL/SQL ORACLE:删除时触发更新

Oracle-触发器和程序包

使用 :new 和 :old 在更新和插入之前触发 Oracle