CREATE OR REPLACE TRIGGER trigger_name
<before | after | instead of> <insert | update | delete>[OF colname] ON table_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
--触发器代码
END;
<before | after | instead of> <insert | update | delete>[OF colname] ON table_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
--触发器代码
END;
create
or
replace
trigger
first_tri
after
delete
or
update
of
custid
on
sys_cust
/*
1.这里可以写成 after delete on sys_cust for each row
如果加了 for each row影响范围就是每行,也就是说一句delete
删除了几行就执行几次,不加表示删除多少行都只执行一次,使用
for each row表示行触发器,否则表示语句触发器。
2. of custid 可以不加,加了表示update custid这col才触发。
3.after表示执行后出发,before表示执行前触发
*/
begin
if
deleting
then
DBMS_OUTPUT.put_line(
'删除成功!'
);
elsif
updating
then
DBMS_OUTPUT.put_line(
'修改成功!'
);
END
IF
;
end
;
执行如下语句:
DELETE
FROM
SYS_CUST T
WHERE
T.CUSTID=-
1
;
输出如下:
执行如下语句:
UPDATE
sys_cust t
set
t.custid=
0
WHERE
rownum
<
2
;
输出如下:
执行如下语句:
UPDATE
sys_cust t
set
t.name=
'0'
WHERE
rownum
<
2
;
没有输出。
行级触发器(也就是用了for each row)可以用:old或:new表示表更前后对应表行的数据信息。
例如给表(
PRD_ATTR)建一个触发器,有一下:
CREATE
OR
REPLACE
TRIGGER
tri_PRD_ATTR
AFTER
INSERT
OR
UPDATE
OR
DELETE
ON
PRD_ATTR
FOR
EACH
ROW
BEGIN
IF
INSERTING
THEN
INSERT
INTO
prv_sync_iog
VALUES
(seq_prv_sync_iog_id.nextval
,
'PRD_ATTR'
,:new.RECID,
'I'
,
SYSDATE
);
ELSIF
UPDATING
THEN
INSERT
INTO
prv_sync_iog
VALUES
(seq_prv_sync_iog_id.nextval
,
'PRD_ATTR'
,:new.RECID,
'U'
,
SYSDATE
);
ELSIF
DELETING
THEN
INSERT
INTO
prv_sync_iog
VALUES
(seq_prv_sync_iog_id.nextval
,
'PRD_ATTR'
,:old.RECID,
'D'
,
SYSDATE
);
END
IF
;
-- 忽略所有错误不影响业务执行;
EXCEPTION
WHEN
OTHERS
THEN
NULL
;
END
;
如以上出现的:old和:new表示将对应操作修改前后表prd_attr的recid记录到prv_sync_iog日志表中。
:new和:old还可以使用:=赋值,例如:
create
or
replace
trigger
first_tri
before
update
of
subtype
on
sys_cust
for
each
row
begin
if
updating
then
:new.subtype := '33';
END
IF
;
end
;
以上触发器表示,对表sys_cust的subtype字段update 的时候,不管update成什么,最后都会update成'33'。
执行以下两句查看结果:
SELECT
*
FROM
sys_cust t
WHERE
T.CUSTID=
760000818760
;
UPDATE
SYS_CUST T
SET
T.subtype=
'11'
WHERE
T.CUSTID=
760000818760
;
使用DDL类型触发器:
例子:
在触发器中使用的事件属性:
还可以定义复合触发器(一个触发器中定义多个类型触发器)、还可以在触发器中使用FOLLOWS关键字,指定触发器之间的执行顺序。
开关触发器:
ALTER TRIGGER trigername DISABLE|ENABLE;