Heim > Datenbank > MySQL-Tutorial > 机房收费系统之触发器

机房收费系统之触发器

WBOY
Freigeben: 2016-06-07 16:01:01
Original
1160 Leute haben es durchsucht

印象里边最早接触触发器是在耿建玲的视频里边见到的,但是完全不理解,但是在实现机房收费系统的时候,就发现原来SQL Server中还有这么一个强大的功能,简直是和存储过程合称为最佳兄弟二人组。 首先我们看看触发器是什么? 触发器,因为我先认识的存储过程+

印象里边最早接触触发器是在耿建玲的视频里边见到的,但是完全不理解,但是在实现机房收费系统的时候,就发现原来SQL Server中还有这么一个强大的功能,简直是和存储过程合称为最佳兄弟二人组。

首先我们看看触发器是什么?

触发器,因为我先认识的存储过程+事务,所以我在这里把他称为存储过程的小兄弟,至于为什么,因为他们真的很像,对于存储过程,大家可以在http://blog.csdn.net/lovemenghaibin/article/details/38235817了解,这里就不详细的介绍了,但是触发器是什么呢?

触发器是SQL Server提供给程序员和数据分析员来保证数据完整性的一种方式,它就是与表事件相关的特殊存储过程。触发器不能被直接执行,只能为表上的Insert\Update\Delete事件所触发。它也不能传递或接受参数。

触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。 比如说,我这里有两张表,一张是充值表(Recharge_Info),一张是学生表(Student_Info),如果我们要进行充值行为,也就是要进行两个动作,第一为学生表的钱加上充值的钱,第二就是为充值表里边添加一条记录,那么如果要完成这个操作,我们需要两步,更新和插入信息,也就说我们会这样 insert Recharge_Info into (cardID,addMoney...) values(@cardID,addMoney...) Update Student_Info set Cash=Cash+addMoney where cardID=@cardID
这个过程如果需要执行多次呢,大家每次都要用两条语句来组合这一个过程,是不是麻烦了点,于是现在就有了触发器这个过程,那么我来为大家来展示一下触发器的相同实现。
CREATE TRIGGER [dbo].[TR_charge_U]<span style="white-space:pre">	</span>--创建触发器
<span style="white-space:pre">			</span>
ON [dbo].[T_Recharge]<span style="white-space:pre">			</span>--在T_ReCharge表

for insert<span style="white-space:pre">				</span>为了插入数据而需要执行的操作

AS 
--定义一些参数
declare @cardID char(10)<span style="white-space:pre">	</span>--卡号
declare @cash decimal(10, 2)<span style="white-space:pre">	</span>--卡内余额
declare @addmoney decimal(10, 2)<span style="white-space:pre">	</span>--充值金额
if UPDATE(cash)

BEGIN
	select @cardID =CardID  from inserted <span style="white-space:pre">	</span>--选择充值表中的卡号	
	select @addmoney=cash  from inserted --选择我们充值表中的充值金额
	select @cash =T_card.cash  from T_Card <span style="white-space:pre">	</span>--选择卡内的余额
	update T_Card  set Cash=@cash+@addmoney  where cardID =@cardID 
END
</span>
Nach dem Login kopieren
这里我们大家解释一下,这个流程是怎么回事,首先我们要执行的语句就是insert Recharge_Info into (cardID,addMoney...) values(@cardID,addMoney...),那么触发器当你在插入数据的时候,就会将信息保存到Inserted中,然后我们再根据需要把里边的数据取出来,用来更新我们需要更新的表。 在触发器中,我们有两张表,一张是deleted表,一张Inserted表,这两张是虚拟表,用用完之后数据库会自动删除。 下面我用表格的形式将他们的用处展现出来

对表的操作

Inserted逻辑表

Deleted逻辑表

增加记录(insert)

存放增加的记录

删除记录(delete)

存放被删除的记录

修改记录(update)

存放更新后的记录

存放更新前的记录

所以我们在执行操作的时候,人们会说触发器是同时操作的,其实不是的,触发器把我们前边说的insert Recharge_Info into (cardID,addMoney...) values(@cardID,addMoney...,Update Student_Info set Cash=Cash+addMoney where cardID=@cardID 自己把逻辑问题给结局了,从而省的我们再写两只三条语句去组合,用一次还好,那么用多次呢? 但是触发器也不是越多越好,因为他是体现在数据库中的一段代码,不会呈现在程序中,所以这在开发的阶段加几个也许不是问题,可是如果要是以后咱们的系统出现问题了,那么要修改这方面就显得有点难了,触发器越是多越是会造成逻辑上的困难,所以建议大家用可以,适当的用。 最后为大家献上创建各种触发器的一些小Demo Insert触发器
create trigger tgr_classes_insert
	on classes
    	for insert --插入触发
	as
    --定义变量
    declare @id int, @name varchar(20), @temp int;
    --在inserted表中查询已经插入记录信息
    select @id = id, @name = name from inserted;
    set @name = @name + convert(varchar, @id);
    set @temp = @id / 2;    
    insert into student values(@name, 18 + @id, @temp, @id);
Nach dem Login kopieren
delete触发器
create trigger tgr_classes_delete
on classes
    for delete --删除触发
as
    print &#39;备份数据中&hellip;&hellip;&#39;;    
    if (object_id(&#39;classesBackup&#39;, &#39;U&#39;) is not null)
        --存在classesBackup,直接插入数据
        insert into classesBackup select name, createDate from deleted;
    else
        --不存在classesBackup创建再插入
        select * into classesBackup from deleted;
    print &#39;备份数据成功!&#39;;
Nach dem Login kopieren
update触发器
create trigger tgr_classes_update
    on classes
    for update
   as
    declare @oldName varchar(20), @newName varchar(20);
    --更新前的数据
    select @oldName = name from deleted;
    if (exists (select * from student where name like &#39;%&#39;+ @oldName + &#39;%&#39;))
        begin
            --更新后的数据
            select @newName = name from inserted;
            update student set name = replace(name, @oldName, @newName) where name like &#39;%&#39;+ @oldName + &#39;%&#39;;
            print &#39;级联修改数据成功!&#39;;
        end
    else
        print &#39;无需修改student表!&#39;;
Nach dem Login kopieren
一个触发器,一个存储过程,一个全自动,一个任意调用,都能让程序运行的更快,占用的资源更少。尽管看上去也很像,功能貌似给我们减少了很多的压力,但是在写的时候,或者说是在设计数据库的时候,我们还是要谨慎的用,否者我们会给软件以后的运行带来难以想象的痛苦。
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage