触发器
定义
触发器是一种机制,用来强制业务规则和数据完整性,当指定表中的数据发生变化时自动生效,以响应INSERT、UPDATE或DELETE 语句。这也是它最主要的作用!
我们最常用的是DML触发器,当触发器在数据库中发生DML事件时启用,它会在表或视图中修改数据的insert、update、delete语句。。
实例
下面,就用实例展示一下触发器的具体写法和用法。
这个实例是当给卡号充值时,在给充值表插入数据的同时,也要更新学生表中的余额。 @H_301_0@ @H_301_0@
-- ============================================= -- Author: <郭贤达> -- Create date: <2015.6.7> -- Description: <充值成功后,更改学生表里的余额> -- ============================================= --由于修改过该触发器,所以,create会自动变为alter ALTER TRIGGER [dbo].[TR_UpdateBalance] --触发器名称 ON [dbo].[T_Recharge] --创建位置 after insert --再插入数据之后 AS --定义变量 declare @InRows int,@CardNO varchar(10),@Recharge numeric(18,1) --通过查询给变量赋值 select @Recharge=Recharge from inserted --inserted表示一个虚拟表来存放我们刚插入的数据 select @CardNO=CardNO from inserted --查询该卡号的充值记录个数 select @InRows =count(*) from T_Recharge where CardNO =@CardNO --如果该卡号充值记录大于1,说明不是新注册用户,执行更新 if @InRows>1 BEGIN SET NOCOUNT ON; --更改余额 update T_Student set Cash=convert(numeric,Cash)+@Recharge where CardNO=@CardNO END
<span style="color: rgb(51,51,255);font-size:18px; font-weight: bold; line-height: 12pt; font-family: Arial,Helvetica,sans-serif; background-color: rgb(255,255,255);"> </span>优点
咱们使用触发器当然是因为它的有很多优点,能给予我们方便,下面我就罗列一下它的好处:
效率高
触发器的开销非常低,运行触发器所占用的时间主要花在引用其它存于内存或磁盘上的表上。
级联修改
可实现多个表的级联修改。当需增删改某表的数据时,其关联表的相应数据也会自动增删改,保证数据的一致性。
简单方便
触发器的使用可以少写很多代码,以事件方式来处理,当数据发生变化的时候,,自动作处理,使我们对表的操作
更加简单。。 @H_301_0@ @H_301_0@ @H_301_0@ 存储过程
定义
存储过程是一组为了完成特定功能的sql语句集,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参
数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
咱们也可以理解为是一些写好的sql语句集,就像是函数方法一样,都写好了封起来,需要用的时候,直接调用。
实例 @H_301_0@ @H_301_0@
-- ============================================= -- Author: <郭贤达> -- Create date: <2015-06-10 15:08:13> -- Description: <从学生表中查询卡号,给退卡表添加数据,然后删除学生表,充值表和上机表中的数据> -- ============================================= ALTER PROCEDURE [dbo].[PROC_ExitCard] -- 定义变量 @CardNO VARCHAR(10),@UserID varchar(10),@Name varchar(10),@ReturnCash varchar(10),@ExitCardDate varchar(20),@ExitCardTime varchar(20),@IsCheckOut varchar(20) AS BEGIN SET NOCOUNT ON; --给学生表添加数据 insert into T_ExitCard(CardNO,UserID,Name,ReturnCash,ExitCardDate,ExitCardTime,IsCheckOut)values(@CardNO,@UserID,@Name,@ReturnCash,@ExitCardDate,@ExitCardTime,@IsCheckOut) --删除学生表、充值表、上机表数据 delete T_Recharge where CardNO=@CardNO delete T_Line where CardNO=@CardNO delete T_Student where CardNO=@CardNO END
@H_301_0@优点
简单方便
存储过程是在数据库中事先写好的,经过第一次编译后再次调用不需要编译,运行速度比较快,降低了网络流量。可
以设置参数,根据传入参数的不同,重复使用同一个存储过程。。
提高效率
当对数据库进行复杂操作时,比如对多个数据表增删改查,咱们就可以利用存储过程进行封装,与数据库提供的事
务相结合。这样一来,可极大提高效率!而且,从代码的角度出发,它是与程序代码分离的,提高了程序代码的可读
性。。
提高安全性
可设定只有某批用户才能使用的权限;因为是参数化查询,可以防止sql注入;存储过程可以接受参数、输出参 数、返回单个或多个结果集以及返回值,可以向程序返回错误原因。
触发器VS 存储过程
当用户执行一个事件,而数据库需要做多处更新的时候,我们就可以考虑去使用它们。这样会使D层可以轻松可靠
执行条件
触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。
灵活性
触发器是强制实行的,只要满足了触发的条件,用户是不能绕过触发器的。而相比之下,存储过程则相对具有灵活
性,在我们的代码中,可以决定什么时候调用存储过程。存储过程就像函数一样,用Execute语句来执行。
弊端
二者虽然强大,每种事物都有两种属性,有利必有弊!
触发器执行有条件限制,不受用户控制,维护困难;存储过程由于只有一次编译,之后就只是调用,使后期的维护
工作是有挑战性。
总的来说,触发器和存储过程的使用,提高了系统执行效率,增强了可读性,使我们的工作方便简单,是值得提倡
的!二者具有一定的相同点,如果真要使用的话,应该首选存储过程。。当然,没有最好的,只有更适合的。。
由于师傅建议我使用原型图,所以,最近一直在学习,也许下一篇博客就是它,尽请期待吧!!!