代码改变世界

数据库回顾之-----触发器

2011-07-09 21:47  myjava2  阅读(341)  评论(0编辑  收藏  举报

    重新回顾牛腩视频的时候,感觉自己对操作数据库,依然有些小问题,不能很顺利的创建触发器,对触发器的了解不是很多,然后自己就开始,复习一下触发器。

 触发器(trigger)是一个特殊的存储过程,它的执行不是程序调用,也不是手动启动,而是由事件来触发,比如对一个表进行(insert,delete,update)时就会激活执行它,触发器经常用于加强数据的完整性和业务规则等。

触发程序时与表有关的命名数据库对象,当表上出现特定的事件时,将激活该对象。

1,             处罚程序与命名为tbl_name的表相关,tbl_name必须引用永久性表,不能将触发程序与临时表和视图关联起来,。

2,             Trigger_time是触发程序的动作时间,它可以是before或after以及instead of,指明触发程序是在激活它的语句之前或之后触发。

3,             Trigger_event指明了激活触发程序的语句类型,即:(insert,delete,update)insert表示将新行插入表中的时候激活该触发程序。Delete表示在删除的时候触发,update表示在更新的时候触发程序。

触发器的语法:

           CREATE TRRIGGER trigger_name   --创建一个触发程序,名字

       ON{table|view}                  --在哪个表上建立触发器

       [WITH ENCRYPTION]            --是否加密

       {{FOR|AFTER|INSTEAD OF}{[INSET],[DELETE],[UPDATE]}} –什么时候触发

       AS 

          [If Update()]

          Begin                         --如果操作成功就执行,语句

         

                                         --所执行的语句

          End

Insert、update、delete:激活触发器的三种操作,可以同时执行,也可以任选其一。

 

deleted 与inserted 数据的差异          

FromBorrowRecord br , Deleted   d ,Insertedi      --Deleted和Inserted临时表
Inserted
存放进行insert和update 操作后的数据
 Deleted
存放进行delete 和update操作前的数据
注意:update 操作相当于先进行delete 再进行insert,所以在进行update操作时,修改前的数据拷贝一条到deleted表中,修改后
的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中

 

更新update触发

  一,1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
     这时候可以用到触发器。对于1,创建一个Update触发器:

     Create Trigger truStudent
       OnStudent                            --在Student表中创建触发器
       forUpdate                         --为什么事件触发
    As                                       --事件触发后所要做的事情
       ifUpdate(StudentID)           
       begin

         Update BorrowRecord
           SetStudentID=i.StudentID
           From BorrowRecordbr , Deleted   d ,Inserted i      --Deleted和Inserted临时表
           Wherebr.StudentID=d.StudentID

       end    

二,对于2,创建一个Delete触发器

2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
     Create trigger trdStudent
       On Student
       for Delete
     As
       Delete BorrowRecord
         From BorrowRecord br , Deltedd
         Where br.StudentID=d.StudentID
    end
     三,创建一个insert触发器

if exists(select * from sysobjects wherename=‘add_gy ' and type='tr')

    droptrigger add_gy

go                           --之上的代码表示,如果触发器已经存在,则删除

create trigger add_gy  on 供应

after insert

as

  declare @tx varchar(30),@sl real

  select @tx=条形码,@sl=供应数量 from inserted

update 商品 set 库存数量=库存数量+@sl where 条形码=@tx

--运行后查看供应表下的触发器add_gy已存在。