SQL Server触发器及触发器中的事务学习(共5篇)由网友“补款火葬场哦”投稿提供,以下是小编整理过的SQL Server触发器及触发器中的事务学习,欢迎阅读分享。
篇1:SQL Server触发器及触发器中的事务学习
-07-07Sql Server 数据库索引整理语句,自动整理数据库索引
-05-05如何将sql执行的错误消息记录到本地文件中实现过程
-08-08sql编程的几个常识
2013-01-01Sql Server 分组统计并合计总数及WITH ROLLUP应用
2009-12-12sqlserver substring函数使用方法小结
2013-09-09把excel表格里的数据导入sql数据库的两种方法
-09-09SQLserver 数据库危险存储过程删除与恢复方法
2011-12-12SQL Server 交叉表查询 case
-04-04sqlserver 此数据库没有有效所有者错误的解决方法
2006-08-08直接循环写入数据
篇2:SQL Server触发器及触发器中的事务学习
最近更 新
sqlserver 中ntext字段的批量替换(updat
C#连接Excel和Excel以上版本做数
SQL 查询分析中使用net命令问题
SQL CONVERT转化函数使用方法小结
MSSQL 游标使用 心得
sqlServer 数据库语法大全
SQL Server 创建简单的存储过程--总
MS SQL SERVER 数据库日志压缩方法与代码
省市县三级联动的SQL语句
SQL Server误区30日谈 第14天 清除日志后
热 点 排 行
SQL Server 图文安装教程
SQL Server 安装图解教程(附
sqlserver中distinct的用法(不重
SQL Server导入、导出、备份数据
SQL语句去掉重复记录,获取重复记
SQL Server数据库入门学习总结
SQL Server错误代码大全及解释(
sql convert函数使用小结
sql 时间函数 整理的比较全了
用SQL语句添加删除修改字段、一些
篇3:了解SQL Server触发器及触发器中的事务
引述
首先, 说下我写篇文章的目的,我希望能把我对触发器的理解,分享出来与你一起学习,如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,和触发器中事务个故事。在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 & DDL触发器)和After触发器 & Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么建议和意见,都可以通过文章后面的回复与我沟通,或者通过E-Mail方式,与 我交流;我的Email地址是:glal@163.com
在下面的内容,用到一些SQL Server 触发器和事务的一些术语,如果有些不明白的地方,可以查阅MSDN资料库,或SQL Server本地帮助文档:
DML触发器(DML Triggers)
DDL触发器(DDL Triggers)
事务模式(Transaction modes)
显式事务(Explicit Transactions)
自动提交事务(Autocommit Transactions)
隐式事务(Implicit Transactions)
批范围的事务(Batch-scoped Transactions)
After触发器 Vs Instead Of触发器
After 触发器将在处理触发操作(Insert、Update 或 Delete)、Instead Of 触发器和约束之后激发。Instead Of是将在处理约束前激发,以替代触发操作。下面两张图描述了After触发器和Instead Of触发器的执行先后顺序。
图1 图2
左边的图1,描述了After触发器执行顺序情况,我在这里通过一个简单的例子来说明After触发器的执行顺序,以便能加深对左图1 After触发器的理解。
先创建表Contact
usetempdb
Go
ifobject_id(Contact)IsNotnull
DropTableContact
Go
CreateTableContact
(
篇4:触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法)
触发器是数据库发生某个操作时自动运行的一类的程序
用于保持数据的完整性或记录数据库操作信息方面
触发器不能够被直接调用,只能够在某些事件发生时被触发,也就是系统自动进行调用触发器的构建语法
create [or replace] trigger trigger_name
before|after
event1 [ or event2 or event3 …]
on table_name [for each row]
begin
statement;
…
end;
event通常是insert、delete或update等DML操作
说明:
For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的 话,表示是表级触发器,则无论操作多少行,都只触发一次;
When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块.
触发器分为语句级触发器和行级触发器
语句级触发器是指每执行一条DML语句,该触发器就执行一次
行级触发器是指每个DML操作影响几条记录,就会触发几次(for each row)
行级触发器中由于涉及到了每条记录的数据变动,所以对于每条记录的数据来说就有新值和旧值之分
关键字:
:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时,在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。
示例(1)
--记录操作数据库信息方面
--创建一个t_emp2_log表用于存储用户对emp2表所做的操作信息
create table t_emp2_log(
t_id number(10) primary key, --编号
t_date date, --修改日期
t_user varchar2(20), --操作用户
action varchar(20) --该用户所做操作
);
--创建触发器t_emp2,当有用户对表emp2操作的时候,就会触发该触发器,记录改用户对表emp2所做的操作
create or replace trigger t_emp2
after update or delete or insert on emp2
begin
if updating then --当执行更新操作时执行
insert into t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user, 'update');
elsif deleting then --当执行删除操作时执行
insert into t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user, 'delete');
elsif inserting then -- 当执行插入操作时
insert into t_emp2_log values(seq_t_emp2_log.nextval, sysdate, user, 'inserting');
end if;
end;
示例(2)
--保持数据的完整性...
create table dept2 as select * from dept;
--当存在依赖表时,当主表的信息发生改变时,依赖表的相应信息也会发生改变
create or replace trigger tr_emp2
--当主表dept2发生改变时,
after update on dept2 for each row
begin
--依赖表也会发生相应的变化,以保持数据的完整性
update emp2 e set e.deptno = :NEW.deptno where e.deptno = :OLD.deptno;
end;
示例 (3)
两个表 字段完全一样
例如:emp 表 emp_ copy 表
要求 :写一个触发器
提示: :NEW :OLD
功能实现
当往emp表内添加字段且deptno=10的时候 往emp_copy表copy此数据
在emp表更新数据时且修改deptno=10 的时候 往emp_copy表copy此数据
--向emp_copy表copy新数据
--emp_copy可以存在相同的记录
create or replace trigger tr_emp_copy
after insert or update on emp2 for each row
begin
if inserting then
if :NEW.deptno = 10 or :OLD.deptno = 10 then
insert into emp_copy values(:NEW.empno, :NEW.ename, :NEW.job,
:NEW.mgr,:NEW.hiredate, :NEW.sal, :NEW.comm, :NEW.deptno);
end if;
elsif updating then
if :OLD.deptno = 10 then
insert into emp_copy values(:NEW.empno, :NEW.ename, :NEW.job,
:NEW.mgr,:NEW.hiredate, :NEW.sal, :NEW.comm, :NEW.deptno);
end if;
end if;
end;
--注意事项
/*
不管是after ,还是 before 在update , insert , delete 时,一定是在事务提交之后才会触发触发器
before 和after的区别:before:insert update 可以对new进行修改,
after :不能对new 进行修改
二者都不能对old 进行修改
*/
create or replace trigger tri_emp2
before update on dept2 for each row
begin
:NEW.deptno := 80;
update emp2 e set e.deptno = :NEW.deptno where e.deptno = :OLD.deptno;
end;
篇5:Oracle触发器在MIS 开发中的应用
Oracle触发器在MIS 开发中的应用
Oracle触发器在MIS 开发中的应用
周海涛 吴良刚
摘要:本文介绍了oracle触发器的概念和类型,总结了oracle触发器在开发MIS中的应用,并提供了实例以供参考.
关键词:MIS 、触发器 oracle
1.引言
本人在做一个大型的MIS系统(前台用powerbuild工具,后台用oracle数据库)时,常碰到一些有关数据冗长性,批量删除和动态信息方面的问题,由此发现数据库触发器简单易用。现将有关开发和应用中的一些体会总结成文,供同行参考。
2.触发器的概念和类型。
数据库触发器(database triggers)是响应插入、更新或删除等数据库事件而执行的过程。它定义了当一些数据库相关事件发生时应采取的动作。可用于管理复杂的完整性约束,或监控对表的修改,或通知其它程序,表已发生修改。它的类型有:语句级触发器,以及行级触发器,前者可以在语句执行前或执行后被触发。后者在每个触发语句影响的行触发一次。还有before和after触发的命令。在insert,update,和delete之前或之后执行,引用新旧值进行处理。如果需通过触发器设定插入行中的某列值,则为了访问“新(new)”值,需使用一个触发器before insert,使用after insert则不行。Instead of 触发器命令,使用它告诉oracle应执行什么操作。以上四种大类合成14种小类(略)。各种触发器的执行顺序如下:
⑴ 如果有,最先执行语句级before触发器。
⑵ 每个insert,delete,update影响的行;
① 如果有,最先执行行级before
② 执行行的delete或update
③ 如果有,执行行级after触发器
⑶ 如果有,执行语句级after触发器
3.使用数据库触发器管理数据冗余性
为了数据分析和制作报表的需要,用户在数据模型中加入了冗余数据,应使用触发器,以保证数据的完整性。
冗余数据可以用规定的 for each row选项的before update触发器进行管理。update 命令可放在触发器中对所有需要更新的冗余数据进行更新,如客户表和订单表,订单表包括客户的订单和客户表的'冗余信息,客户表(customer)的表结构:客户号(cu_no)、客户名(cu_name)、客户地址(cu_address)。订单表(order)的表结构:订单号(or_no),客户号(or_no),客户名(cu_name),客户地址(cu_address),当客户基表中的数据被更新时更新订单中的冗余列。语法如下:
create or replace trigger bj_customer
before update on customer
for each row
begin
update order set
cu_no=:new.cu_no,
cu_name=:new.cu_name,
cu_address=:new.cu_addess,
where cu_no=:old.cu_no;
end;
4.用触发器完成数据复制
如果需求非常有限,可以用数据触发器从一个数据库中向另一个数据库复制数据,如果数据复制需求仅与数据的插入有关,当一条记录插入到一个数据库中的某个基表中时,用户还希望把这条记录插入到一个远程数据库中,需用create database link语句创建一条到远程数据库的连接,一旦创建了一条数据库连接后,就可以在基表上创建一个after insert触发器,以把每一条记录插入到远程数据库中。
(1)在脚本中创建数据库连接(database link)bj_ysd_remote基表作为数据库基表,Bj_ysd_local代表本地数据库上的源基表。
Creat database link remote(连接名)
Connect to bj(帐户) indentified by bj(密码)
Using ‘:2’;
(2)复制记录
create or replace trigger trig_ysd(触发器名)
after insert on bj_ysd_local
for each row
begin
insert into bj_ysd_remote@dblink remote
value(:new.x1,:new.x2,……)/*x1.x2代表字段名*/
end;
(3)删除记录
create or replace trigger trig_ysd_del
after delete on bj_ysd_local
for each row
begin
delete from bj_ysd_remote@dblink remote
where x1=:old.x1
end;
5.用数据库触发器完成瀑布式删除操作
在某些情况下,当要删除一条记录时,该记录是与外键有关的另外一张基表上的记录时,这个删除操作必须在模型中进行传递,否则会出现大量的冗长数据,仍以cumstomer 和order基表为例,当从customer中删除一个客户时,order基表中所有相关记录也应当删除。
Create or replace trigger trig_cust
Before delete on customer
For each row
Begin
Delete from order;
Where cu_no=old.cu_no;
End;
6.用触发器完成动态数据的操作
在涉及如何实现动态库存的问题时,可用触发器解决。仓库有验收、出库、调拨、报废、退料、让售等这些数据必须与以前的库存相加减,才能完成动态库存操作。本文仅以验收单触发器为例,其它的结构雷同。它们涉及到两个基表:bi_ysd(验收单),Bj_kcb(当前库存表),前者的表结构(rq(日期),ysdh(验收单号), bjbm(备件编码),yssl(验收数量),ysdj(验收单价)),后者的表结构为(bjbm(备件编码),dqkcl(当前库存量),dqkcje(当前库存金额))触发器如下:
create or replace trigger trig_ysd
after insert or update or delete on bj_ysd
for each row
declare rq1 varchar2(8);rq2 varchar2(8);
/*限于篇幅,yssl1,yssl2,ysdj1,ysdj2,bjbm1,bjbm2,ii声明略*/
if inserting or updating then
rq1:=:new.rq;bjbm1:=:new.bjbm;yssl1:=:new.yssl;
ysdj1:=:new.ysdj;
select count(*) into ii from bj_dqkcb
where bjbm=bjbm1;
if ii=0 then
insert into bj_dqkcb(bjbm,dqkcl,dqkcje)
value(bjbm1,yssl1,ysdj1);
else
update bj_dqkcb
set dqkcl=dqkcl+yssl1;
dqkcje=dqkcje+yssl1*ysdj1;
end if
end if
if deleting or updating then
rq2:=:old.rq;bjbm2:=:old.bjbm;yssl2:=:old.yssl;
ysdj2:=:old.ysdj;
update bj_dqkcb
set dqkcb=dqkcl-yssl2;
dqkcje=dqkcje-yssl2*ysdj2
end if;
end ;
7.结束语
数据库触发器在数据库开发、MIS开发上有很广泛的应用,但经验表明,使用过多的触发器将降低整个数据库的性能。如果数据库触发器写得不好,它会很快破坏数据库的性能,因此,在适当的时候使用恰当的触发器显得非常重要。
参考文献:
Michael Abbey.机械工业出版社.Oracle8初学者指南,1998
Joline Morrison.机械工业出版社.Oracle8数据库指南,1999
Tile:The applications of the oracle triggers in the
development of MIS
Abstract:the paper introduces the concept and types of the oracle triggers,summarizes the applications of the oracle triggers in the MIS,and provides the examples for reference.
Key words:oracle trigger
zhtsam@263.net
通讯地址:湖南长沙中南大学岳麓校区新研公寓617信箱
邮编:410083
e-mail:zhtsam@263.net
电话:0731-8832997
call:0731-95838-16056
★ 数据库实训总结
★ 统计周报表范文
★ 数据库面试题
【SQL Server触发器及触发器中的事务学习(共5篇)】相关文章:
面试软件测试自我评价2022-06-13
任务驱动教学法在数据库教学中的应用论文2023-08-10
数据库工程师的工作职责2022-11-11
数据库工程师工作的职责2023-03-16
SQLSERVER语句返回表结构2022-10-31
软件测试简历自我评价2023-09-01
软件测试求职的自我评价2023-04-12
NET架构师岗位的工作职责2022-10-30
VB实训个人总结2022-07-05
“任务驱动”教学法在高职教学中的运用2023-02-16