我想在表上使用触发器,每次插入,更新或删除行时都会触发该触发器。
我写了这样的话:
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)。 如何知道该行是否已被删除?
答案 0 :(得分:37)
检测被解雇的DML操作 触发器
如果有多种类型的DML操作 可以触发一个触发器(例如,ON 插入或删除或更新 Emp_tab),触发器体可以使用 条件谓词INSERTING, DELETING和UPDATING来检查哪个 语句类型触发触发器。
所以
IF DELETING THEN ... END IF;
应该适合您的情况。
答案 1 :(得分:22)
我已经改变了我的代码并且它有效:
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;
答案 2 :(得分:4)
NEW值(或重命名为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')
您可能需要在触发器内添加逻辑,以满足将“HBP000”中的field1更新为其他内容的代码。
答案 3 :(得分:1)
将其分为2个触发器。一个用于删除,另一个用于插入\更新。