ORACLE和TRIGGERS(插入,更新,删除)

Lef*_*tyX 24 oracle triggers

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

我写了这样的东西:

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') 
Run Code Online (Sandbox Code Playgroud)

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

dev*_*vio 38

来自使用触发器:

检测触发触发器的DML操作

如果多种类型的DML操作可以触发触发器(例如,ON INSERT OR DELETE OR UPDATE OF Emp_tab),则触发器主体可以使用条件谓词INSERTING,DELETING和UPDATING来检查触发器的哪种类型的语句.

所以

IF DELETING THEN ... END IF;
Run Code Online (Sandbox Code Playgroud)

应该适合你的情况.

  • 感谢您的回答.有用.我有DELETING的一些问题.我想这不是因为这个条件而导致的问题new_buffer.field1 ='HBP00'. (2认同)

Lef*_*tyX 24

我已经改变了我的代码,它可以工作:

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;
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 5

NEW值(或您已重命名为NEW_BUFFER)仅在插入和更新时可用。要删除,您需要使用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') 
Run Code Online (Sandbox Code Playgroud)

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