SQL Server触发器及触发器中的事务学习

时间:2022-12-01 07:56:04 其他范文 收藏本文 下载本文

SQL Server触发器及触发器中的事务学习(共5篇)由网友“补款火葬场哦”投稿提供,以下是小编整理过的SQL Server触发器及触发器中的事务学习,欢迎阅读分享。

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

关于在SQLSERVER里调用COM组件数据库教程

基于Client/Server 的课件系统的设计与实现

win 安装 sqlserver 的方法数据库教程

数据库实训总结

统计周报表范文

数据库面试题

一个常用的报表统计SQL语句

试析真实任务驱动式教学法在高职平面广告设计教学中的应用

软件工程师求职简历范文

网站开发网站维护人员简历

SQL Server触发器及触发器中的事务学习
《SQL Server触发器及触发器中的事务学习.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【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

点击下载本文文档