PL/SQL 触发器

本文详细介绍了PL/SQL中的触发器,包括触发器的分类(DML、DDL、系统触发器)、触发器的类型(事前、事后、行级、语句级)、伪记录的使用、触发器的条件谓词以及触发器的管理。还讨论了触发器的限制,如不允许重复监听、在同一个事务内等,并提到了大型系统中触发器的性能考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1触发器
 本质上:也是一个存储过程
1、存储过程可以带参数,触发器没有。
2、存储过程可以主动调用,触发器不能调用


分类1 DML触发器 insert 
      DDL触发器 create alter drop
      系统触发器(启动、停止、登录、退出)


分类2 事前触发器 before 事后触发器after




分类3 行级触发器 语句级触发器


伪记录(幻表):new old  伪记录
  insert 有new幻表 没有old幻表


  update 有new幻表 有old幻表


  delete 没有new幻表 有old幻表 


  before insert or update or delete
on busi_td_cart  
for each row  --行级触发器
declare
  -- local variables here
begin
   --dbms_output.put_line('触发器开始啦!');
--raise_application_error(-20001,'我会往外面抛一个异常');
if inserting then
--因为insert 操作而触发
update Cart_Count t set t.insert_c = t.insert_c+1;
dbms_output.put_line('新插入的记录有:'||:new.id);
elsif updating then
--因为update 操作而触发
 update Cart_Count t set t.update_c = t.update_c+1;
dbms_output.put_line('老记录:'||:old.id||'新记录:'||:new.id);
elsif deleting then
--因为delete操作而触发
update Cart_Count t set t.delete_c = t.delete_c+1;
dbms_output.put_line('被删除的记录有:'||:old.id);
end if;
end;




2条件谓词:inserting updating deleting


注意:
   触发器不允许重复监听
触发器的打断效果


/*
针对UserInfo表所有的触发器,
事前触发器
语句级触发器
*/


create or replace trigger UserInfo_B_IDU
  before insert or update or delete
on busi_td_cart  
for each row  --行级触发器
declare
  -- local variables here
begin
   dbms_output.put_line('触发器开始啦!');
raise_application_error(-20001,'我会往外面抛一个异常');
end;






3  触发器的编译过程


编译 ——》编译成功——》执行事前触发器——》数据增删改——》执行事后触发器




 raise_application_error(错误编号,错误信息);
错误编号:写负数,写2000以后
错误信息:写字符串




可以分开写触发器,监听三种不同的操作;
也可以写成一个触发器,通过判断不同的谓词来区分。




触发器和引发触发器执行的增删改行为 在同一个事务内  触发器内部不允许写commit或者rollback;
触发器不允许操作本表






4  什么时候没有幻表?
只有增删改的行级触发器 才有幻表




5   DDL触发器
create or replace trigger Global
  after  ddl
on LYJ.schema
declare
 
begin
--ora.sysevent() 记录操作
--ora_dict_obj_type() 记录类型
--org_dict_obj_name() 记录名字
--org_login_user() 记录登录的账号
   dbms_output.put_line('执行的操作'||ora_sysevent());
dbms_output.put_line('记录类型'||ora_dict_obj_type());
dbms_output.put_line('记录名字'||ora_dict_obj_name());
dbms_output.put_line('记录登录的账号'||ora_login_user());
end Global;
 




create or replace trigger trg_dbs_01
    --after startup 服务开启
--before  shutdown 服务关闭
--after logon 登录成功
before logoff --退出登录
on database  
  
declare
  -- local variables here
begin
--用一张表的记录记录退出记录
  null;
end ;




6 管理触发器
    触发器状态:有效(启用 禁用) 无效


禁止: alter trriger 触发器名字 disable;
激活: alter trriger 触发器名字  enable;
全体禁止: alter table 表 disable all trrigers;
全体激活:  alter table 表 enable all enable;


自动失效:修改触发器监听的表的结构
生效:重新编译触发器
     1、手工操作:找到触发器  右键  Recompile
     2、代码实现:alter trigger 名字 compile;


删除: drop trigger 名






大型软件系统 用得少 性能
级联触发器


最大32级级联效果 性能下降非常严重


性能表现:1索引 
         2显示游标 (相当于一个容器对象)
         3触发器







































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值