触发器

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;

简单例子:
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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值