oracle trigger //语法: CREATE [OR REPLACE] TRIGGER <trigger_name> {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name> [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]] [FOR EACH ROW [WHEN (<trigger_condition>)]] <trigger_body> //几点需要注意的地方: //1.对于表,我们只能建立before和after trigger, // instead of trigger只能用于视图,特别是用于视图的更新。 //2.你可以使用关键字来标识三个触发事件,而且,update后面可以跟着可选参数: // of和一部分表里面需要更新的列。目前,of子句只为update设计: ... insert on table_name ... ... insert or delete or update on table_name ... ... update of a,b or insert on table_name ... //3.如果你选择了for each row,那么这个触发器是行级别的触发器, // 否则,是语句级别的。 //4.行级别的触发器: // 4.1 特殊变量 NEW 和 OLD 可以参考新旧元组,在trigger body中, // NEW和OLD前面必须跟着一个冒号(:),但是,在when语句里面,可以将冒号前缀去掉 // 4.2 referencing 子句是用来为new和old分配别名的。 // 4.3 触发器的限制可以在when子句里面的括号中。触发条件应该是一个为了激活触发器, // 而满足于oracle sql限制的一个sql语句。这个条件不包括子查询,没有这个我很子句, // 这个触发器为每一行而触发的。 //5.<trigger_body>是一个PL/SQL块,而不是一些sql语句的排列。oracle的<trigger_body>里面, // 有一些限制,为了避免在a触发器里面激活b触发器,然后b触发器有触发下一个,... // 这样多播级的(或者无终止的)触发器发生,在<trigger_body>里面有下面的限制: // 5.1 你不能修改触发器中涉及到的表的结构。 // 5.2 你不能修改一个联系到其他触发关系的约束,例如外键约束。 //下面是一个实例: create table vegetable( id number, name varchar2(15), price number(5,2), p_date date) / create table price_change( id number, name varchar2(15), old_price number(5,2), chg_date date ) / insert into vegetable select 1001,'西红柿',2.02,to_date('2010-05-10 06:00:00','yyyy-mm-dd hh24:mi:ss') from dual union all select 1004,'大葱',5.50,to_date('2010-06-18 12:05:56','yyyy-mm-dd hh24:mi:ss') from dual union all select 1102,'胡萝卜',3.05,to_date('2010-06-01 00:10:00','yyyy-mm-dd hh24:mi:ss') from dual union all select 1150,'大白菜',0.55,to_date('2010-07-08 15:20:00','yyyy-mm-dd hh24:mi:ss') from dual / create or replace trigger tri_price_chg before update of price on vegetable for each row when(new.price <> old.price) begin dbms_output.put_line('vegetable id = '|| :old.id); dbms_output.put_line('old price = '|| :old.price); dbms_output.put_line('new price = '|| :new.price); dbms_output.put_line('the price has been changed'); insert into price_change(id,name,old_price,chg_date) values(:old.id,:old.name,:old.price,sysdate); end tri_price_chg; / update vegetable set price=1.55 where id=1001 / vegetable id = 1001 old price = 2.02 new price = 1.55 the price has been changed 1 row updated -- alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; select * from vegetable; ID NAME PRICE P_DATE ---------- --------------- ---------- ------------------- 1001 西红柿 1.55 2010-05-10 06:00:00 1004 大葱 5.5 2010-06-18 12:05:56 1102 胡萝卜 3.05 2010-06-01 00:10:00 1150 大白菜 .55 2010-07-08 15:20:00 select * from price_change; ID NAME OLD_PRICE CHG_DATE ---------- --------------- ---------- ------------------- 1001 西红柿 2.02 2011-05-21 16:39:28 参考: http://infolab.stanford.edu/~ullman/fcdb/oracle/or-triggers.html 原帖: http://topic.csdn.net/u/20110520/11/50153cf5-18ce-4a2a-b1f2-52fd130519ac.html?23853