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' ...
随机推荐
- grep工具及正则表达式
正则表达式和通配符 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串.vim.grep.awk.sed都支持正 ...
- System.nanoTime
System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数. System.nanoTime()返回的是纳秒,nanoTime而返回的可能是任意 ...
- BZOJ 1488: [HNOI2009]图的同构 [Polya]
完全图中选出不同构的简单图有多少个 上题简化版,只有两种颜色....直接copy就行了 太诡异了,刚才电脑上多了一个不动的鼠标指针,然后打开显卡管理界面就没了 #include<iostream ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- Nginx日志分析及脚本编写
在我们日常的运维中,当Nginx服务器正常运行后,我们会经常密切关注Nginx访问日志的相关情况,发现有异常的日志信息需要进行及时处理. 那今天我将跟大家一起来研究和分析Nginx日志,nginx默认 ...
- visual studio code右侧的预览面板能关闭吗?
https://segmentfault.com/q/1010000010082399 "editor.minimap.enabled":false
- Linux下配置SNAT上网
局域网有一台主机A,没有公网的IP, 也就是没有办法直接连到互联网上下载东西,同时内网有另外一台主机B,有公网接入.这个时候为了让A连接到互联网,我把B设置成NAT主机,A的网关指向B.准确的来说,现 ...
- 织梦默认编辑器 按下回车生成br标签改为生成p标签
找到文件 \include\ckeditor\config.js 把 config.enterMode = CKEDITOR.ENTER_BR; config.shiftEnterMode = CKE ...
- PHP系统左侧菜单栏的管理与实现
在日常的开发工作中,面对后台的日益增长的业务,以及后期业务的迭代开发,通常会选择添加菜单栏的形式来扩充业务功能,同样日益增长的后台菜单选项也为我们后期的维护,产生了一定的困难性.为此我总结出自己关于左 ...
- 【NOIP2012】 疫情控制
[NOIP2012] 疫情控制 标签: 倍增 贪心 二分答案 NOIP Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...