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 和触发器(插入、更新、删除)的主要内容,如果未能解决你的问题,请参考以下文章