说到oracle的触发器,一直以来都以为只能以表触发,今天有需求某个字段的值改变后触发一系列动作,原来想这个表改变再触发,后来想了一下,触发器本来很耗性能,如果这个表的每个字段更改都触发,这样做就造成性能浪费,查了一下发现原来可以字段触发:
语法:
-
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]
例子:
-
create or replace trigger 触发器名
-
after update of 字段
-
on 表
-
for each row
-
when (new.字段=条件)
------------------------------------------------------------------- 验证 -----------------------------------------------------------------------
创建diy_test表:
-
SQL> create table diy_test
-
2 (a number,
-
3 b number
-
4 )
-
5 /
-
表已创建。
往diy_test插入数据:
-
SQL> insert into diy_test values(1,1);
-
已创建 1 行。
创建diy_test_1表:
-
SQL> create table diy_test_1
-
2 (a number,
-
3 c number
-
4 )
-
5 /
-
表已创建。
往diy_test_1插入数据
-
SQL> insert into diy_test_1 values(1,1);
-
已创建 1 行。
创建字段级触发器:当diy_test的字段b更改为2,则把diy_test_1的字段c改成2
-
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> 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> 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,触发成功。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28996307/viewspace-1965840/
,如需转载,请注明出处,否则将追究法律责任。