您的位置:首页 > 数据库 > Oracle

oracle trigger(触发器)字段触发

2015-04-01 10:37 513 查看
说到oracle的触发器,一直以来都以为只能以表触发,今天有需求某个字段的值改变后触发一系列动作,原来想这个表改变再触发,后来想了一下,触发器本来很耗性能,如果这个表的每个字段更改都触发,这样做就造成性能浪费,查了一下发现原来可以字段触发:

语法:

[sql] view
plaincopy





CREATE [OR REPLACE] TRIGGER trigger_name  

 {BEFORE | AFTER }  

 {INSERT | DELETE | UPDATE [OF column [, column …]]}  

 [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]  

 ON [schema.]table_name | [schema.]view_name   

 [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]  

 [FOR EACH ROW ]  

 [WHEN condition]  

例子:

[sql] view
plaincopy





create or replace trigger 触发器名  

after update of 字段  

on 表  

for each row  

when (new.字段=条件)  

 

-------------------------------------------------------------------          验证          -----------------------------------------------------------------------

创建diy_test表:

[sql] view
plaincopy





SQL> create table diy_test  

  2  (a number,  

  3  b number  

  4  )  

  5  /  

表已创建。  

往diy_test插入数据:

[sql] view
plaincopy





SQL> insert into diy_test values(1,1);  

已创建 1 行。  

创建diy_test_1表:

[sql] view
plaincopy





SQL> create table diy_test_1  

  2  (a number,  

  3  c number  

  4  )  

  5  /  

表已创建。  

往diy_test_1插入数据

[sql] view
plaincopy





SQL> insert into diy_test_1 values(1,1);  

已创建 1 行。  

 

创建字段级触发器:当diy_test的字段b更改为2,则把diy_test_1的字段c改成2

[sql] view
plaincopy





SQL> create or replace trigger diy_test_trigger  

  2  after update of b  

  3  on diy_test  

  4  for each row  

  5  when (new.b=2)  

  6  begin  

  7  update diy_test_1 set c=2 where a= :new.a;  

  8  end;  

  9  /  

触发器已创建  

 

测试1:先将diy_test的b更改成3

[sql] view
plaincopy





SQL> update diy_test set b=3 where a=1;  

已更新 1 行。  

  

SQL> select * from diy_test_1;  

         A          C  

---------- ----------  

         1          1  

结果显示diy_test_1的字段c没发生改变

 

测试2:将diy_test的b更改成2

[sql] view
plaincopy





SQL> update diy_test set b=2 where a=1;  

已更新 1 行。  

  

SQL> select * from diy_test_1;  

         A          C  

---------- ----------  

         1          2  

结果显示diy_test_1的字段c变成2,触发成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: