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' ...
随机推荐
- 导入一个新项目需要注意的几大问题(jdk1.6+eclipse4.4+tomcat6)
今天导项目犯了一个很低级的错误,浪费了半个小时,所以在此罗列出在导一个新的项目到eclipse中时需要注意的几个问题,希望对大家有所帮助. 将项目从svn或者github等项目版本控制软件上拷贝下来, ...
- c# 简单实现 插件模型 反射方式
利用反射方式实现插件模型,wpf控件作为插件,然后用另外的窗体加载. 首先定义插件接口: public interface IUserControlLevel1 { string PluginName ...
- 数据分区------《Designing Data-Intensive Applications》读书笔记9
进入到第六章了,我们要开始聊聊分布式系统之中的核心问题:数据分区.分布式系统通常是通过大规模的数据节点来处理单机没有办法处理的海量数据集,因此,可以将一个大型数据集可以分布在多个磁盘上,查询负载可以分 ...
- SSH 面试题集锦
1. BeanFactory的作用是什么? [中] BeanFactory是配置.创建.管理bean的容器,有时候也称为bean上下文.Bean与bean的依赖关系,也是由BeanFactory ...
- 在eclipse的配置文件里指定jdk路径
在eclipse的配置文件里指定jdk路径,只需在eclipse的配置文件里增加-vm参数即可. 打开eclipse目录下的eclipse.ini配置文件,增加-vm配置,需要注意的是该参数要加在-v ...
- Java内存回收机制基础[转]
原文链接:http://blog.jobbole.com/37273/ 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了J ...
- MySQL完全备份、增量备份与恢复[转]
原文链接:http://www.360doc.com/content/11/1209/09/834950_170836197.shtml 场景:每周日执行一次完全备份,每天下午1点执行增量备份 [ 适 ...
- bzoj 3033: 太鼓达人 [欧拉回路]
3033: 太鼓达人 题意:长m的01环,每个长k的子串都是不同的01串.给出k,求最大的M以及字典序最小的方案. \(M=2^k\) 可以把k-1位01串看成点,k位01串就是边,满足欧拉回路的条件 ...
- 自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案
做为一名刚接触自动化测试的人,才知道单元测试原来也挺有讲究的. 我塞,Test注解报错,没有道理啊~之前好好的,怎么会出现这样~ 原因如下,本人新建了个Test类,报错重名, 难怪提示Test不是注解 ...
- java环境搭建 windows
windows搭建Java环境 1.下载java开发工具jdk安装包 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...