??? CREATE [OR REPLACE] TRIGGER trigger_name
??? {BEFORE | AFTER }
??? {INSERT | DELETE | UPDATE [OF column [, column ...]]}
??? ON {[schema.] table_name | [schema.] view_name}
??? [PRFERENCING {OLD [AS] old | NEW [AS] new | PARENT as parent}]
??? [FOR EACH ROW ]
??? [WHEN condition]
??? Trigger body;
???
說明:
??? 1
、
BEFORE/AFTER
:指觸發時間在
DML
操作之前還是之后
(
對表配置約束時特別有用
)
??? 2
、
DML
包括
INSERT
、
DELETE
、
UPDATE(
可以只針對某幾列
)
??? 3
、
FOR EACH ROW
:表明是行級觸發器
DML 觸發器示例
??? 1 、創建信息表和最終表
??? create
table
t11(a
int
,b
varchar2
(
100
));
??? insert
into
t11
values
(
1
,
'aaa'
);
??? insert
into
t11
values
(
1
,
'bbb'
);
??? insert
into
t11
values
(
1
,
'ccc'
);
??? insert
into
t11
values
(
2
,
'ddd'
);
??? insert
into
t11
values
(
2
,
'eee'
);
??? insert
into
t11
values
(
3
,
'fff'
);
??? insert
into
t11
values
(
4
,
'ggg'
);
??? insert
into
t11
values
(
5
,
'hhh'
);
??? commit
;
???
create
table
t1_log(
???
?? who
varchar2
(
30
),
???
?? poer_date
date
???
?? );
??? 2 、創建觸發器
???
create
or
replace
trigger
delete_trigger
???
?
after
delete
???
?
on
t11
???
?
for
each
row
--
行級觸發器
???
begin
???
?
insert
into
t1_log
values
(
user
,
sysdate
);
???
end
;
??? 3 、測試
??? delete from t11 where a= 1 ;
???
SQL
>
select
*
from
t1_log;
?
???
WHO????? POER_DATE
???
------- -------------------
???
WXQ?????
2008
-
11
-
2
14
:
04
:
38
???
WXQ?????
2008
-
11
-
2
14
:
04
:
38
???
WXQ?????
2008
-
11
-
2
14
:
04
:
38
??? 注:若沒有 for each row 語句,則只插入一行記錄。
觸發器的級聯
???
create
table
t1_a(
id
int
);
???
create
table
t1_b(
id
int
);
???
create
table
t1_c(
id
int
);
???
create
trigger
tr_a
???
?
after
insert
???
?
on
t1_a
???
begin
???
?
insert
into
t1_b
values
(
1
);
???
end
;
--
插入
t1_a
時,插入
t1_b
???
create
trigger
tr_b
???
?
after
insert
???
?
on
t1_b
???
begin
???
?
insert
into
t1_c
values
(
1
);
???
end
;
--
插入
t1_b
時,插入
t1_c
???
create
trigger
tr_c
???
?
after
insert
???
?
on
t1_c
???
begin
???
?
update
tr_a
set
tr_a.id=tr_a.id+
10
;
???
end
;
--
插入
t1_c
時,更新
t1_a
??? 測試:
???
SQL
>
insert
into
t1_a
values
(
5
);
???
1
row
inserted
???
SQL
>
select
*
from
t1_a;
???
??
ID
???
-----
???
??
15
多條件觸發器
??? CREATE OR REPLACE TRIGGER
??? BEFORE INSERT OR UPDATE OR DELETE
??? BEGIN
????? IF inserting THEN
????? --insert
語句觸發
????? ELSIF updating THEN
????? --update
語句觸發
????? ELSIF deleting THEN
????? --delete
語句觸發
????? END IF;
??? END;
??? 注:若要針對 update 某一列,則用 IF UPDATING('xx') THEN...
??? 具體舉例 :
???
create
or
replace
trigger
oper_trigger
???
?
before
insert
or
update
or
delete
???
?
on
t1
???
declare
???
? str_action
varchar2
(
100
);
???
begin
???
?
if
inserting
then
???
??? str_action:=
'Insert'
;
???
?
end
if
;
???
?
if
updating
then
???
??? str_action:=
'Update'
;
???
?
end
if
;
???
?
if
deleting
then
???
??? str_action:=
'Delete'
;
???
?
end
if
;
???
?
insert
into
t1_log
values
(str_action,
sysdate
);
???
end
;
行級觸發器特性
??? 1 、簡單舉例
???
create
or
replace
trigger
reco_trigger
???
?
after
delete
???
?
on
t11
???
?
for
each
row
???
begin
???
?
insert
into
t22
values
(:old.a,:old.b);
???
end
;
??? 2 、說明:
???
*
可以通過
:new
和
:old
來獲得操作前后的不同數據映像
??? * update
可同時使用
:new
、
:old
,
insert
只能用
:new
,
delete
只能用
:old
??? 3 、通過 REFERENCING 修改映像標識符
???
create
or
replace
trigger
reco_trigger
???
?
before
update
???
?
on
t11
???
?
referencing
new
as
my_value
--
注意格式
???
?
for
each
row
?????
when
(my_value.a >
10
)
--
新值大于
10
時才觸發
???
begin
???
?
insert
into
t22
values
(:my_value.a,:my_value.b);
???
end
;
??? 注意:即使重命名了,但是還是要在前面加“ : ”,但是在 referencing 和 when 字句中不用加