oracle trigger(触发器)字段触发

来源:互联网 发布:淘宝宝贝图片尺寸用750 编辑:程序博客网 时间:2024/06/10 13:39

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

语法:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. CREATE [OR REPLACETRIGGER trigger_name  
  2.  {BEFORE | AFTER }  
  3.  {INSERT | DELETE | UPDATE [OF column [, column …]]}  
  4.  [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]  
  5.  ON [schema.]table_name | [schema.]view_name   
  6.  [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]  
  7.  [FOR EACH ROW ]  
  8.  [WHEN condition]  

例子:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. create or replace trigger 触发器名  
  2. after update of 字段  
  3. on 表  
  4. for each row  
  5. when (new.字段=条件)  

 

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

创建diy_test表:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> create table diy_test  
  2.   2  (a number,  
  3.   3  b number  
  4.   4  )  
  5.   5  /  
  6. 表已创建。  

往diy_test插入数据:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> insert into diy_test values(1,1);  
  2. 已创建 1 行。  

创建diy_test_1表:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> create table diy_test_1  
  2.   2  (a number,  
  3.   3  c number  
  4.   4  )  
  5.   5  /  
  6. 表已创建。  

往diy_test_1插入数据

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> insert into diy_test_1 values(1,1);  
  2. 已创建 1 行。  

 

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

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> create or replace trigger diy_test_trigger  
  2.   2  after update of b  
  3.   3  on diy_test  
  4.   4  for each row  
  5.   5  when (new.b=2)  
  6.   6  begin  
  7.   7  update diy_test_1 set c=2 where a= :new.a;  
  8.   8  end;  
  9.   9  /  
  10. 触发器已创建  

 

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

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> update diy_test set b=3 where a=1;  
  2. 已更新 1 行。  
  3.   
  4. SQL> select * from diy_test_1;  
  5.          A          C  
  6. ---------- ----------  
  7.          1          1  

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

 

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

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. SQL> update diy_test set b=2 where a=1;  
  2. 已更新 1 行。  
  3.   
  4. SQL> select * from diy_test_1;  
  5.          A          C  
  6. ---------- ----------  
  7.          1          2  

结果显示diy_test_1的字段c变成2,触发成功。

0 0
原创粉丝点击