触发器和存储过程

定义: 何为触发器?在 SQL Server 里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 
       常见的触发器有三种:分别应用于 Insert , Update , Delete  事件。 

       我为什么要使用触发器?比如,这么两个表: 

      Create Table Student(              -- 学生表 
        StudentID int primary key,       -- 学号 
        .... 
       ) 

      Create Table BorrowRecord(               -- 学生借书记录表 
        BorrowRecord   int identity(1,1),       -- 流水号    
        StudentID      int ,                    -- 学号 
        BorrowDate     datetime,                -- 借出时间 
        ReturnDAte     Datetime,                -- 归还时间 
        ... 
      ) 

      用到的功能有
        1. 如果我更改了学生的学号 , 我希望他的借书记录仍然与这个学生相关 ( 也就是同时更改借书记录表的学号 ); 
        2. 如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 
      等等。 

      这时候可以用到触发器。对于 1 ,创建一个 Update 触发器: 

     Create Trigger truStudent 
       On Student                         -- Student 表中创建触发器 
       for Update                          -- 为什么事件触发 
     As                                        -- 事件触发后所要做的事情 
       if Update(StudentID)            
       begin 

         Update BorrowRecord 
           Set StudentID=i.StudentID 
           From BorrowRecord br , Deleted   d ,Inserted i      --Deleted Inserted 临时表 
           Where br.StudentID=d.StudentID 

       end        
                 
      理解触发器里面的两个临时的表: Deleted , Inserted  。注意 Deleted  Inserted 分别表示触发事件的表 旧的一条记录 新的一条记录 。 
      一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是: 
                              虚拟表 Inserted                      虚拟表 Deleted 

在表记录新增时       存放新增的记录                           不存储记录 
          修改时             存放用来更新的新记录                     存放更新前的记录 
          删除时             不存储记录                               存放被删除的记录 


      一个 Update  的过程可以看作为:生成新的记录到 Inserted 表,复制旧的记录到 Deleted 表,然后删除 Student 记录并写入新纪录。 

      对于 2 ,创建一个 Delete 触发器 
     Create trigger trdStudent 
       On Student 
       for Delete 
     As 
       Delete BorrowRecord 
         From BorrowRecord br , Delted d 
         Where br.StudentID=d.StudentID 

     从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。






触发器的基础知识和例子 
create trigger tr_name 
on table/view 
{for | after | instead of } [update][,][insert][,][delete] 
[with encryption] 
as {batch | if update (col_name) [{and|or} update (col_name)] } 

说明: 
1 tr_name :触发器名称 
2 on table/view :触发器所作用的表。一个触发器只能作用于一个表 
3 for after :同义 
4 after instead of :sql 2000新增项目afrer 与 instead of 的区别 
After 
在触发事件发生以后才被激活,只可以建立在表上 
Instead of 
代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上 
5 insertupdatedelete:激活触发器的三种操作,可以同时执行,也可选其一 
6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响, 
所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。 
触发器执行时用到的两个特殊表:deleted ,inserted 
deleted inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一 
样的,只是存放 的数据有差异。 

续 
下面表格说明deleted inserted 数据的差异 
deleted inserted 数据的差异 
Inserted 
存放进行insertupdate 操作后的数据 
Deleted 
存放进行delete update操作前的数据 
注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后 
的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验四 存储过程触发器与索引 一、实验目的 1.熟悉大型数据库实验环境,以MS SQL SERVER为例; 2.掌握视图; 3.掌握存储过程触发器; 4.掌握MS SQL SERVER的导入和导出; 5.掌握MS SQL SERVER的索引。 二、实验内容 (1)使用“实验一”中的数据库“abc”,创建一个视图,生产厂家为“北京”且价格低于北京生产的产品的平均价格,输出产品的名称、价格和生产厂家。 (2)使用“实验一”中的数据库“abc”,创建一个带有输入参数的存储过程proc_abc,查询指定职工的销售记录,用户输入职工编号,存储过程返回职工名称、产品名称、销售日期、销售数量,假如执行存储过程时所提供的“职工编号”不存在,存储过程应给予一定的提示。 (3)使用“实验一”中的数据库“abc”,练习使用游标, 写出按如下报表形式显示结果的SQL语句,该报表查询每年每种产品总销售金额,(总销售金额=价格*销量),报表显示格式如下所示: 年 产品号 产品名 销售总量 总销售金额(万元) 2001年 2 AAA 590 3.2 2001年 5 BBB 644 23.3 2002年 1 CCC 32 0.2 (4)使用“实验一”中的数据库“abc”,练习使用触发器,在销售表上创建触发器tr_updateprice,每次新增销售记录时,自动更新产品表的单价,更新方法是:每增加一笔销售记录,就将该产品的单价减去1块钱。 (5)将100万行网络连接监控数据Netflow导入数据库,创建多个索引,观察创建索引对数据库文件大小的影响;并设计不同的查询语句来观察索引对查询效率的影响;可以尝试将100万行记录扩展为1000万行,然后再做索引和查询的实验?文件见附件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值