DML触发器1
数据库触发器是特殊的存储程序。通常不直接调用它们,而是由数据库的事件触发。
触发器分类:
>DML触发器
>instead-of触发器
>系统事件触发器,还可以是DDL
一. DML触发器
在数据库上执行insert,update,delete时,DML触发器会被激活。
种类 | 值 | 说明 |
语句 | insert,update,delete | 定义导致激活触发器的类型 |
激活时间 | before,after | 什么时候执行 |
级别 | 行级,语句级 | 行级:激活事件针每影响一行记录,触发一次 |
--eg.1
create or replace trigger author_tring --触发器名
after update of first_name --激活时间
on authors --针对的表
for each row --语句级
when(OLD.first_name!=NEW.first_name) --限制
begin --动作(触发器主体)
DBMS_OUTPUT.PUT_LINE(
'First Name'
||:OLD.first_name
||'has change to'
||:NEW.first_name
);
end;
/ --eg.2
--用category_stats表存储存books表的各类型category的图书数目和平均价格
create table category_stats(
catageory_stats varchar(20),
total_books number,
average_price number
); --实现:当books表改变后,catageory_stats表的信息自动改变
create or replace trigger UpdateCategoryStats
after insert or deleteor update on books --针对的表
declare --声明
cursor c_Statistics is
select category,
count(*) total_books,
avg(price) average_price
from books
group by category --使用游标记录books表的一些聚合信息
begin
delete from table category_stats; --删除原来的信息
for v_StatsRecord in c_Statistics loop --遍历游标,将信息插入到category_stats表
insert into category_stats(category_stats,total_books,average_price)
vaules(v_StatsRecord.category,v_StatsRecord.total_books,
v_StatsRecord.average_price);
end loop;
end UpdateCategoryStats;
1. DML触发器的激活顺序
>1.执行before 语句级触发器
>2.对受该语句影响的每一条记录
.执行before行级触发器
.执行语句本身
.执行after行级触发器
>3.执行语句级触发器
create sequence trig_seq
start with 1
increment by 1; create or replace package TrigPackage as
v_Counter number;
end TrigPackage; create or replace trigger BooksBStatement
before update on books
begin
TrigPackage.v_Counter:=0; --语句级before触发器
insert into temp_table(num_col,char_col)
vaules(trig_seq.nextval,'before statement:counter='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
end BooksBStatement
/ create or replace trigger BooksAStatement1 --语句级after触发器1
after update on books
begin
insert into temp_table(num_col,char_col)
vaules(trig_seq.nextval,'after statement:counter1='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
end BooksBStatement1
/ create or replace trigger BooksAStatement2 --语句级after触发器2(会先执行2)
after update on books
begin
insert into temp_table(num_col,char_col)
vaules(trig_seq.nextval,'after statement:counter2='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
end BooksBStatement2
/ create or replace trigger BooksBRows1 --行级before触发器1
before update on books
for each row
begin
insert into temp_table(num_col,char_col)
vaules(trig_seq.nextval,'before row:counter1='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
end BooksBRows1
/ create or replace trigger BooksBRows2 --行级before触发器2
before update on books
for each row
begin
insert into temp_table(num_col,char_col)
vaules(trig_seq.nextval,'before row:counter2='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
end BooksBRows2
/ create or replace trigger BooksARow ----行级after触发器
after update on books
for each row
begin
insert into temp_table(num_col,char_col)
vaules(trig_seq.nextval,'after row:counter='||TrigPackage.v_Counter);
TrigPackage.v_Counter:=TrigPackage.v_Counter+1;
end BooksBRows
/
--测试
--books表中category=Oracle Ebusiness有两条记录
update books
set category ='Oracle'
where category='Oracle Ebusiness'; select * from temp_table
order by num_col;
结果:
num_col char_col
1 before statement:counter=0
2 before row2:counter=1
3 before row1:counter=2
4 after row:counter=3
5 before row2:counter=4
6 before row1:counter=5
7 after row:counter=6
8 after statement:counter2=7
9 after statement:counter1=8
>>可以看到结果和上面归纳的顺序是一样的
DML触发器1的更多相关文章
- SQL Server 数据库DML触发器 【一】
今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内 ...
- 杂谈--DML触发器学习
触发器按类型分为三类: 1. DML 触发器,在数据变更时触发: 2. DDL 触发器,在修改数据库级别或实例级别对象时触发: 3. Login 触发器,在用户登录时触发: 最常见的是DML触发器,D ...
- SQL语句(二十一)—— 触发器(DML触发器)
触发器 一 .触发器概述(特殊的存储过程) 定义: 在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用. 作用: ...
- 触发器三(行级DML触发器)(学习笔记)
行级DML触发器 每当一条记录出现更新操作时进行触发操作定义时要定义FOR EACH ROW 使用":old.字段"和":new.字段"标识符 No. 触发语句 ...
- 触发器二(DML触发器)(学习笔记)
DML触发器(语句触发器) 由DML语句进行触发,当用户执行了INSERT,UPDATE,DELETE操作时就会触发操作 示例一.只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和 ...
- 监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)
原文:监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2) 在有些公司中,由于管理的不规范,或者是便于开发人员直接修改.部署程序,往往任何开发人员,都能登录到生产 ...
- 今天说一下DML触发器的顺序
因为05之后的版本允许了一个对象有多个after触发器,所以呢~顺序方面还是要留意一下下的.比如我现在要往一个测试表里面添加多个触发器. USE Test GO ,),Name )) GO CREAT ...
- DML 触发器2
2.行级触发器的关联标识符 :new,:old >>1. 一般通过:new.filed 引用(filed是trigger_table的字段名) :new :old中filed字段的意义 触 ...
- 创建dml触发器
-实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student' ...
随机推荐
- [Android] Toast问题深度剖析(二)
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...
- es6 Object.assign
ES6 Object.assign 一.基本用法 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目 ...
- URL中特殊符号的处理
问题描述 我们在对接第三方系统的时候通常需要get或post来传输数据,但此时如果参数中存在&% #*!包括空格等特殊符号的时候就无法正常请求具体表现在参数获取不正确或者获取不到参数,甚至有时 ...
- MySQL建立外键(Foreign Key)
如果在最初建立表的时候就建立外键这样一般不会有什么问题,顺便说一下建立外键的时候,需要注意的地方. cascade方式在父表上update/delete记录时,同步update/delete掉子表的匹 ...
- 奥酷HTML5视频直播系统AMS6.0
今日,北极星通自主研发的流媒体服务系统Aoku Media Server6.0发布了,将正式支持HTML5直播,这使得网页中无需有flash播放插件或者其他插件,可直接观看直播,HTML5直播也会使得 ...
- 学习资料分享:Python能做什么?
最近一直忙着研究学习Python,很久没更新博客了,整理了一些Python学习资料,和大家分享一下!每天更新一篇~ 一.Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一 ...
- 原生ajax写的上拉加载
上拉加载的思路 1 上拉加载是要把屏幕拉到最底部的时候触发ajax事件请求数据 2.所有要获取屏幕的高度 文档的高度 和滚动的高度 下面的代码是已经做好了兼容的可以直接拿来用 Javascript: ...
- 【项目记录】-路灯监测 gmap.net
需求 2016年5月,客户要求在地图上显示路灯及数据,分析数据生成报表,以便查看分析路灯情况. 选型 国外项目就不考虑国内的地图了,开始想使用google的web地图,考虑到地图上标记物过多影响性能及 ...
- Spring框架系列之AOP思想
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.AOP概述 (1).什么是 AOP AOP 为 Aspect Oriented Progra ...
- 微信小程序(一)
开发流程 注册微信小程序并申请微信支付-->制作小程序-->上传并提交审核-->审核通过,小程序上线 开发微信小程序需要准备 企业公众号(被认证)以及申请小程序.微信开发技术.S ...