zoukankan      html  css  js  c++  java
  • 【机房收费个人版】触发器与存储过程

         这篇博客主要写的是触发器和存储过程的应用、实例、长处、不同及弊端,最后通过总的分析。总结出谁更胜一筹。


         
    触发器

         定义
         触发器是一种机制,用来强制业务规则和数据完整性。当指定表中的数据发生变化时自己主动生效,以响应INSERT、UPDATE或DELETE 语句。这也是它最基本的作用!

         我们最经常使用的是DML触发器,当触发器在数据库中发生DML事件时启用,它会在表或视图中改动数据的insert、update、delete语句。。

         实例
         以下,就用实例展示一下触发器的详细写法和使用方法。


         这个实例是当给卡号充值时。在给充值表插入数据的同一时候,也要更新学生表中的剩余金额。

    -- =============================================
    -- 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>
         长处
         咱们使用触发器当然是由于它的有非常多优点,能给予我们方便,以下我就罗列一下它的优点:
         效率高
         触发器的开销很低。执行触发器所占用的时间主要花在引用其他存于内存或磁盘上的表上。


         级联改动
         可实现多个表的级联改动。

    当需增删改某表的数据时,其关联表的对应数据也会自己主动增删改,保证数据的一致性。
         简单方便
         触发器的使用能够少写非常多代码,以事件方式来处理,当数据发生变化的时候,,自己主动作处理,使我们对表的操作
    更加简单。

     

         

         存储过程

         定义
         存储过程是一组为了完毕特定功能的SQL语句集,用户通过指定存储过程的名字并给出參数(假设该存储过程带有參
    数)来运行它。存储过程是数据库中的一个重要对象。不论什么一个设计良好的数据库应用程序都应该用到存储过程。
         咱们也能够理解为是一些写好的SQL语句集,就像是函数方法一样,都写好了封起来。须要用的时候,直接调用。

         实例

    -- =============================================
    -- 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

         

         长处
         简单方便
         存储过程是在数据库中事先写好的,经过第一次编译后再次调用不须要编译,执行速度比較快,减少了网络流量。


    以设置參数。依据传入參数的不同,反复使用同一个存储过程。。
         提高效率
         当对数据库进行复杂操作时,比方对多个数据表增删改查,咱们就能够利用存储过程进行封装,与数据库提供的事
    务相结合。

    这样一来。可极大提高效率!并且,从代码的角度出发。它是与程序代码分离的,提高了程序代码的可读

    性。。


         提高安全性
         可设定仅仅有某批用户才干使用的权限;由于是參数化查询。能够防止SQL注入;存储过程能够接受參数、输出參数、返回单个或多个结果集以及返回值。能够向程序返回错误原因。
     
     
         

         触发器VS 存储过程


         同样点
         当用户运行一个事件,而数据库须要做多处更新的时候。我们就能够考虑去使用它们。这样会使D层能够轻松可靠

    的实现很多复杂的功能,提高效率和代码可读性。。


         不同点
         运行条件
         触发器主要是通过事件运行触发而被运行的,而存储过程能够通过存储过程名称名字而直接调用。
         灵活性
         触发器是强制实行的,仅仅要满足了触发的条件,用户是不能绕过触发器的。

    而相比之下。存储过程则相对具有灵活

    性。在我们的代码中,能够决定什么时候调用存储过程。存储过程就像函数一样。用Execute语句来运行。
         弊端
         二者尽管强大,每种事物都有两种属性,有利必有弊。
         触发器运行有条件限制。不受用户控制,维护困难;存储过程因为仅仅有一次编译。之后就仅仅是调用。使后期的维护

    工作是有挑战性。


         总结
         总的来说。触发器和存储过程的使用,提高了系统运行效率,增强了可读性,使我们的工作方便简单。是值得提倡
    的。二者具有一定的同样点,假设真要使用的话,应该首选存储过程。

    。当然,没有最好的,仅仅有更适合的。


         因为师傅建议我使用原型图,所以,近期一直在学习,或许下一篇博客就是它,尽请期待吧!!


         分享:存储过程的创建与调用

  • 相关阅读:
    X、Y轴抖动的动画
    ViewFlipper的简单用法
    让手机连接到指定的WIFI网络,适用于之前已经连过的网络
    Eclipse 离线汉化的方法
    自己写的SeekBarPreference,可以实现seekbar滑动监听和设置默认进度和最大进度
    录制Android屏幕软件——屏幕录像专家
    【转】解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的问题
    Java中的线程实现
    获得手机当前的ip地址
    操作Wifi的工具类
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6905554.html
Copyright © 2011-2022 走看看