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' ...
随机推荐
- css选择器:nth-child()与:nth-of-type()的差异
:nth-child()和:nth-of-type()都是Css3中的伪类选择器,其作用相似却又不完全相同. 名词解释 :nth-child()选择器匹配其父元素的第n个子元素,不论元素类型. :nt ...
- 18_Python列表常用方法总结
''' 1.列表切片索引\截取 2.列表的增删改查 3.列表最大值\列表最小值\排序 4.列表的遍历 5.列表的嵌套 6.列表和字符串的互转 7.判断元素是否在列表中 ''' #列表使用中括号表示 元 ...
- Zookeeper启动时报8080端口被占用
zookeeper启动时报8080 端口被占用,导致启动失败.特别是服务器上部署了tomcat服务时需要注意. 通过查看zookeeper的官方文档,发现有3种解决途径: (1)删除jetty. (2 ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- Matplotlib学习笔记(二)
原 Matplotlib学习笔记 参考:Python数据科学入门教程 Python3.6.1 jupyter notebook .caret, .dropup > .btn > .car ...
- 2018/1/28 RocketMq学习笔记
RocketMq是支持Topic模式的MQ中间件,它的传输格式为topic(主题,一个product对应一个主题,),Tag(标签,其实就是副标题,是为了更好的支持集群模式而出现的,这样客户端可以指定 ...
- 2018/1/15 JAVA多线程相关
本文不说synchronized相关,它就是JAVA的一个保留关键字,jdk自己实现了它,但说真的,可应用场景真的少,相比lock接口,它还是被淘汰好吧; 首先,说说lock接口,lock接口是一个工 ...
- void指针和const指针
void指针:主要是便于传递不同类型的参数 const指针: const char *p :const 在* 的左边表示指向一个常量指针:表示指向的内容不可变(*p不能变,p可以改变) int a = ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- PyCharm安装Pygame方法
最近在自学Python,然后终于到了项目实战的时候了,而且还是做一个游戏,热情直接被调动起来了,嘿嘿 首先要安装一个Pygame 环境 win7 先去 这里 下载对应Python的Pygame版本 如 ...