触发器 (trigger)
触发器指隐含的执行的存储过程,既当特定事件出现时自动执行的存储过程。
当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql块

触发器的功能:自动生成数据,
自定义复杂的安全权限,
提供审计和日志记录,
启用复杂的业务逻辑

触发器类型
模式(DDL)触发器,执行DDL语句时执行
数据库级触发器,在发生打开,关闭,登录,退出数据库等系统事件时执行
DML触发器(行级触发器:对影响的每个行执行一次
语句级触发器:无论受影响的行数是多少,只执行一次
instead of 触发器 :用于用户不能直接使用DML语句修改的视图

限制:触发器中不能使用控制语句(commit,rollback,savepoint)
由触发器所调用的过程或函数也不能使用控制语句
触发器中不能使用long,long raw类型

当触发器被触发时,要使用被插入,更新或删除的记录中的列值,有时要使用操作前,后列的值。
实现:
:new 修饰符访问操作完成后列的值
:old修饰符访问操作前完成前列的值

使用create trigger 命令创建
语法
create or replace trigger 名
after/before/instead of
insert/[or]update of column/[or]delete
on 表名
[for each row ] --行触发器,每触发一行时触发
[when (condition)]
pl/sql块

before类型触发器

 脚本:--删除表drop table book;--创建表bookcreate table book (bid number,bname varchar2(50),bhouse varchar2(50),pinym varchar2(50));--插入数据insert into book(bid,bname,bhouse,pinym) values(1,'笑傲江湖','人民出版社','xajh');insert into book(bid,bname,bhouse,pinym) values(2,'钢铁是怎样炼成的','人民出版社','gtszylcd');insert into book(bid,bname,bhouse,pinym) values(3,'平凡的世界','人民出版社','pfdsj');commit;案例:before类型
--创建触发器,在插入一条记录或者修改了bid这个字段的时候将pinym修改为大写
--注意,如果这里我们修改的不是bid这个字段,则不会触发触发器,如果需要,只需要将of bid去掉
create or replace trigger tri_01
before insert or update of bid
on book
for each rowbegin:new.pinym :=upper(:old.pinym);end;
--测试
update book set bid = 3 where bid = 3
案例:before类型,条件类型
--创建触发器,在插入一条记录或者修改了bid这个字段的时候如果改变的这条记录pinym的字符长度大于5,修改出版社名称
create or replace trigger tri_01
before insert or update of bid
on book
for each rowwhen (length(new.pinym)>5)--此处new不需要在前面加冒号begin--:new.pinym :=upper(:old.pinym);:new.bhouse := '繁花似锦出版社';end;
--测试
insert into book(bid,bname,bhouse,pinym) values(4,'鲁宾逊漂流记','人民出版社','lbxplj');

after类型触发器

案例:after类型
--创建触发器,在删除一条记录的时候,将这条记录备份在另一张表中
脚本:
--创建表
create table bbook as select * from book where 1<0;
--创建触发器
create or replace trigger tri_02
after delete on book
for each rowbegininsert into bbook(bid,bname,bhouse,pinym) values(:old.bid,:old.bname,:old.bhouse,:old.pinym);end;

触发器谓词:
oracle提供了三个参数,inserting,updateing,deleting,用于判断触发了哪些操作
inserting,updateing,deleting如果触发的语句为,inset,update,delete语句,则为true,否则为false
我们可以根据这在写日志,追踪
案例:

--创建日志表
create table test_log(myuser number(3),mytype varchar(20),mydate date );
--创建序列
create  sequence xul;
--需要用到序列来实现序号的自动递增
--创建触发器
create or replace trigger test_1
after delete or update or insert
on book
declarev_type test_log.mytype%type;
beginif inserting thenv_type := 'insert';dbms_output.put_line('记录成功插入,记录到日志');insert into test_log(myuser,mytype,mydate) values (xul.nextval,v_type,sysdate);elsif deleting then   v_type := 'delete';dbms_output.put_line('记录成功删除,记录到日志');insert into test_log(myuser,mytype,mydate) values (xul.nextval,v_type,sysdate);elsif updating then   v_type := 'update';dbms_output.put_line('记录成功修改,记录到日志');insert into test_log(myuser,mytype,mydate) values (xul.nextval,v_type,sysdate);end if;
end;

案例:统计book表,并且在book进行删除,更新,插入操作时可以同步更新
脚本:

--创建表bookcreate table book (bid number,bname varchar2(50),bhouse varchar2(50),pinym varchar2(50));--插入数据insert into book(bid,bname,bhouse,pinym) values(1,'笑傲江湖','人民出版社','xajh');insert into book(bid,bname,bhouse,pinym) values(2,'钢铁是怎样炼成的','人民出版社','gtszylcd');insert into book(bid,bname,bhouse,pinym) values(3,'平凡的世界','人民出版社','pfdsj');commit;
--创建统计表
create table tongj as select bhouse,count(*) sum from book group by bhouse
--创建触发器
--原理:在进行操作之后,触发器将原来的统计表数据删除,使用游标将新统计的数据插入到统计表中,来实现同步更新
create or replace trigger zd_tongj
after insert or update or delete on book
declare
--使用游标来进行数据存储
--游标的作用是用来存储多行数据
cursor C0 is select bhouse,count(*) sum from book group by bhouse;begin delete from tongj;for C1 in C0 loopdbms_output.put_line('出版社:'||C1.bhouse||'数量:'||C1.sum);insert into tongj(bhouse,sum)values(C1.bhouse,C1.sum);end loop;close C0;end;/*--另一种循环方法创建触发器create or replace trigger zd_tongj
after insert or update or delete on book
declare
cursor C0 is select bhouse,count(*) sum from book group by bhouse;
C2 tongj.bhouse%type;
C3 tongj.sum%TYPE;begindelete from tongj;open C0;loopFETCH C0 INTO C2, C3;exit when C0%notfound;dbms_output.put_line('出版社:'||C2||'数量:'||C3);insert into tongj(bhouse,sum)values(C2,C3);end loop; close C0;
end;*/--测试     delete from book where bid = 3

instead of 触发器
它主要用在视图上,当视图涉及到多张表,或者有统计函数不能进行修改时,我们是不能进行修改的,如果要修改,就要使用instead of 触发器。否则修改会报错
脚本:

 --删除表drop table students purge;drop table chengjs purge;--创建表create table students(xueh varchar2(5),xingm varchar2(10),xingb varchar2(3),nianl number(3));create table chengjs(xueh varchar2(5),kec varchar2(10),chengj number(3));--测试数据insert into students(xueh,xingm,xingb,nianl) values ('1','张三','男',18);insert into students(xueh,xingm,xingb,nianl) values ('2','李四','男',17);insert into students(xueh,xingm,xingb,nianl) values ('3','王五','男',19);insert into students(xueh,xingm,xingb,nianl) values ('4','马六','男',18);insert into chengjs(xueh,kec ,chengj) values ('1','语文',123);insert into chengjs(xueh,kec ,chengj) values ('1','数学',143);insert into chengjs(xueh,kec ,chengj) values ('1','英语',133);insert into chengjs(xueh,kec ,chengj) values ('2','语文',63);insert into chengjs(xueh,kec ,chengj) values ('3','英语',12);commit;--创建视图create or replace view stu_cheng_viewasselect s.xueh,s.xingm,c.kec,c.chengjfrom students s,chengjs cwhere s.xueh = c.xueh ;--命令行查看表结构:desc stu_cheng_view

如果在stu_cheng_view这个视图里面插入记录:

 insert into stu_cheng_view values('4','马六','数学',128);sql>ORA-01779: 无法修改与非键值保存表对应的列--因为视图是虚拟表,由两个表合成的,所以无法修改

但是如果想要修改,就必须使用instead of触发器

 create or replace trigger view_triggerinstead of inserton stu_cheng_viewfor each rowdeclarecursor stu_cur is select * from students s where s.xueh = :new.xueh;cursor cheng_cur is select * from chengjs c where c.xueh = :new.xueh and c.kec = :new.kec;a stu_cur%rowtype;b cheng_cur%rowtype;beginopen stu_cur;open cheng_cur;fetch stu_cur into a;fetch cheng_cur into b; if stu_cur%notfound theninsert into students(xueh,xingm,xingb,nianl) values (:new.xueh,:new.xingm,null,null);elseupdate students set xingm = :new.xingm where xueh = :new.xueh;end if;if cheng_cur%notfound theninsert into chengjs(xueh,kec ,chengj) values (:new.xueh,:new.kec,:new.chengj);elseupdate chengjs set chengj = :new.chengj where xueh = :new.xueh and kec = :new.kec;end if;close stu_cur;close cheng_cur;end;

DDL触发器(模式触发器):
适用于我们在创建,删除,,等DDL操作时,记录下我们的操作;
语法:

CREATE [OR REPLACE] TRIGGER trigger name {BEFORE | AFTER } { DDL
event} ON {DATABASE | SCHEMA} 范围是on database、on schema , on schema
作用范围只是在hr用户下create table等触发,其他用户则不会。若是on database则其他用户create table时会触发该触发器

案例:

--创建日志表
create table table_log(myuser varchar2(15),
mydate varchar2(20),
user_type varchar2(10),
obj_name varchar2(15),
obj_type varchar2(10) );
--创建触发器
create or replace trigger trr_log_table after drop or create on schema
begin
insert  into table_log values (user,sysdate,sys.dictionary_obj_name,sys.dictionary_obj_owner,sys.dictionary_obj_type);
end;

创建完成之后,在执行其他DDL操作,我们的操作记录就会留在table_log 这个表中

pl/sql编程----触发器相关推荐

  1. ORACLE PL/SQL编程之八:把触发器说透

    ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 8. ...

  2. pl/sql编程基础

    PL/SQL 1.过程.函数.触发器是pl/sql编写的 2.过程.函数.触发器是存放在oracle数据库中的 3.pl/sql是非常强大的过程化语言 4.过程.函数.触发器可以在java程序中调用 ...

  3. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  4. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  5. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  6. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...

    [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) --通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE P ...

  7. ORACLE PL/SQL编程

    PL/SQL程序设计 什么是PL/SQL PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言存储过 ...

  8. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  9. Oracle学习笔记(最重要的是PL/SQL编程)

    一:Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1) sys用户是超级用户,具有最高权限,具有sysdba角色,有create databa ...

最新文章

  1. serlvert jsp mysql_JAVA基础:Java多语言编码问题解析(2)
  2. 组件化 Todo List 编写笔记
  3. linux sqlite图形工具,Linux操作系统下的几款svn gui工具介绍
  4. windows ftp服务器_ftp客户端软件,推荐6个流行的FTP客户端软件
  5. python写前端代码_哪种ide能同时写java和前端代码?
  6. kafka java编程demo_Kafka简单客户端编程实例
  7. html中websocket获取数据,如何使用websocket从数据库中获取数据来刷新视图
  8. ASP.NET开发资源
  9. 聚类算法应用场景实例十则
  10. Nginx配置静态资源
  11. 【神仙打架】特奖答辩前10出炉,两名CS学生3篇顶会一作,有人周读3000页英文论文...
  12. 青鸟影院的最后一部分
  13. vue + ElementUI如何动态删除表格当前行内容
  14. pyquery库之爬取豆瓣读书
  15. 遍历QListWidget 所有item
  16. srgb色彩空间_网页设计师的色彩:了解sRGB
  17. 数数字(找规律+模拟)
  18. 计算机专业调研报告图片,计算机专业毕业设计论文(计算机专业调研报告范文)...
  19. ES Module 和 Commonjs | require和import的区别
  20. 艺术家与AI研究者的跨界碰撞丨记青源Workshop「AI+艺术」研讨会(2022年第10期)...

热门文章

  1. 文本 - CL_GUI_TEXTEDIT
  2. 本周白银价格走势仍关注美经济数据
  3. librosa | 系统实战(一 ~ 四)
  4. offset、事件对象、事件鼠标的坐标、键盘事件、输入框放大显示的案例
  5. 浪潮服务器系统raid5,浪潮服务器RAID配置及系统引导.doc
  6. facebook用户数量
  7. 时空弯曲是必须的吗?
  8. 如何搭建一个自己的安全测试实验室WebGoat?
  9. C语言:输出斐波那契数列前二十项
  10. 抖音短视频如何做到“精准获客”