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' ...
随机推荐
- dom4j读取xml
-----记录和回顾是一个比学习更重要的环节----- 一.首先,我们需要知道xml是做什么的 1.作为软件的配置文件 2.作为数据的载体(小型的数据库) 二.xml的语法 xml文件以xml后缀名结 ...
- 高仿bootstrap样式的分页插件
链接:https://pan.baidu.com/s/1jKgn2hK 密码:whwl 不知道是自己的第几个分页插件了,以前写一个丢一个,桌面,U盘,移动硬盘.想用的时候找不到,这次传网上来.大家帮忙 ...
- left join on/right join on/inner join on/full join on连接
现在有两张表,第一张表是用户表,第二张表是订单表.情况是这样的,在我这张用户表里用户很多,但是真正下单的人却不多,而且,每一个用户可以有多个订单.然后领导喊话了,小王,你给我查下,现在咱们的订单有多少 ...
- 使用Google Cloud Platform构建机器学习项目-宠物识别
宠物识别我们使用到了tensorflow object-detection API (https://github.com/tensorflow/models/tree/master/researc ...
- JBOD
JBOD(Just a Bunch Of Disks)不是RAID,它是可以把不同容量的硬盘串连成一个大的逻辑盘,与RAID0不同的是在写入数据时是向一个硬盘写入,写满后再向下一个硬盘写. 尽管建议采 ...
- BZOJ 3684: 大朋友和多叉树 [拉格朗日反演 多项式k次幂 生成函数]
3684: 大朋友和多叉树 题意: 求有n个叶子结点,非叶节点的孩子数量\(\in S, a \notin S\)的有根树个数,无标号,孩子有序. 鏼鏼鏼! 树的OGF:\(T(x) = \sum_{ ...
- R语言-广义线性模型
使用场景:结果变量是类别型,二值变量和多分类变量,不满足正态分布 结果变量是计数型,并且他们的均值和方差都是相关的 解决方法:使用广义线性模型,它包含费正太因变量的分析 1.Logistics回归( ...
- win7局域网共享文件
调整共享文件所在电脑设置: 1. 关闭防火墙 2. 更改网络设置 ①打开网络和共享中心 ②进入"选择家庭组和共享选项" ③进入"更改高级共享设置" ④调整设置并 ...
- Ubuntu 配置FTP服务器
第三方的文件传输软件用着很不爽,想着自己搭建一个FTP来干活. 首先检查是否已经安装了FTP,输入命令: vsftpd -v 可以查看版本,如果没有安装,无法执行. 安装FTP p.p1 { mar ...
- Halcon一日一练:图像拼接技术2:步骤与例程
上一篇主要介绍了图像拼接的一些原理和方法,这一篇将主要介绍步骤和例程: 接上一篇: 基于特征的接拼方法,分为四个步骤 1.特征检测:从图像中检测出显著且独特的图像特征,诸如:闭合区域,直线段,边缘,轮 ...