我是靠谱客的博主 平淡大炮,最近开发中收集的这篇文章主要介绍sql server2008 触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

Ø 什么是触发器

    触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

     DML触发器分为:

    1、 after触发器(之后触发)

        a、 insert触发器

        b、 update触发器

        c、 delete触发器

     2、 instead of 触发器 (之前触发)

     其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

    五﹕使用T-SQL语句来创建触发器   基本语句如下﹕                  

create trigger trigger_name           

on {table_name | view_name}           

{for | After | Instead of }            [ insert, update,delete ]           

as            sql_statement  

   六﹕删除触发器:   基本语句如下﹕

     drop trigger trigger_name  

  七:查看数据库中已有触发器:  

-- 查看数据库已有触发器

use jxcSoftware go select * from sysobjects where xtype='TR'  

-- 查看单个触发器 exec sp_helptext '触发器名'

  八﹕修改触发器:  

基本语句如下﹕ alter trigger trigger_name           

on {table_name | view_name}           

{for | After | Instead of }            [ insert, update,delete ]           

as            sql_statement


1、触发器实例

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  

实例2:

--创建一张学生表(Student)
--创建一张学生借书登记表(BorrowRecord)

Create Table Student(               --学生表
       StudentID int primary key,      --学号
       StudentName varchar(20)         --学生名称
)

Create Table BorrowRecord(               --学生借书记录表
       BorrowRecord  int identity(1,1),      --流水号  
       StudentID     int ,                   --学号
       BorrowDate    datetime,               --借出时间
       ReturnDAte    datetime,               --归还时间
   
 )
------创建一个触发器(修改学生表中的学生id时 同时修改学生借书记录表中的学号)
    -------------------------------------------------------
    --Name:t_update_Student
    --func:更新BorrowRecord 的StudentID,与Student同步。
    --Use :None
    --User:System
    --Author:  
    --Date  :  2009-12-26 
    -------------------------------------------------------
----触发器修改方法一
 Create Trigger t_update_Student
      On Student
      for Update
    As
      if Update(StudentID)
      begin
        Update br 
          Set br.StudentID=ins.StudentID
          From BorrowRecord br , Deleted  del ,Inserted ins 
          Where br.StudentID=del.StudentID
      end      

----触发器修改方法二
 Create Trigger t_update_Student
      On Student
      for Update
    As
      if Update(StudentID)
      begin
          declare @newid varchar(50)
          declare @oldid varchar(50)
   select  @oldid=StudentID from deleted
          select  @newid=StudentID from Inserted
          update BorrowRecord set StudentID=@newid where StudentID=@oldid
      end     

------创建一个触发器(删除学生表中的学生id时 同时删除学生借书记录表中的学号)

    -------------------------------------------------------
    --Name:t_del_Student
    --func:同时删除 BorrowRecord 的数据
    --Use :None
    --User:System
    --Author:
    --Date  :  2009-12-26
    -------------------------------------------------------
    Create trigger t_del_Student
      On Student
      for delete
    As
      begin 
 declare @sid varchar(50)
 select @sid=StudentID from deleted
 delete from BorrowRecord where StudentID=@sid
      end
----解释:inserted、deleted
   --这是两个虚拟表,inserted 保存的是 insert 或 update之后的记录,deleted 保存的是delete 或 update 之前的记录。
---------创建完毕
SELECT type,xtype,name FROM   sysobjects 
----检查是否存在某触发器   可结合删除创建触发器语句执行
     if EXISTS (SELECT name 
       FROM   sysobjects 
       WHERE  name = 't_del_Student' --触发器名
       AND    type = 'TR')
  begin
     --DROP TRIGGER Trig_Del  ---执行相应的操作
     print 'yes'
  end
      else
         begin  ---不存在则执行别的操作
    print 'no'
         end
  ----解释sysobjects  为系统系统对象表。 保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等
     --字段 name为 对象名称
     --字段 type为 对象类型   ‘TR’为 触发器

-----删除触发器
DROP TRIGGER t_update_Student
DROP TRIGGER t_del_Student
---现在插入数据
 ---给Student插入数据
insert into Student(StudentID,StudentName) values(2009001001,'张三')
insert into Student(StudentID,StudentName) values(2009001002,'李四')
insert into Student(StudentID,StudentName) values(2009001003,'王五')
 ---给BorrowRecord插数据
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(2009001001,getdate(),getdate())
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(2009001002,getdate(),getdate())
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(2009001003,getdate(),getdate())

---查询两表数据
select * from Student
select * from BorrowRecord


----修改Student表中张三的记录
update Student set StudentID='2009001008' where StudentID='2009001001'
--控制台信息
--(所影响的行数为 1 行)
--(所影响的行数为 1 行)
---说明修改触发器执行成功

---继续测试删除
delete from Student where StudentID='2009001008'
   
----查看触发器内容
exec sp_helptext 't_update_Student'---触发器名称
----查看触发器属性
exec sp_helptrigger Student ---表名


-----触发器回滚
   ---如果程序不想用户修改学生名称则可以修改此触发器
   ---如果用户要修改学生名称(StudentName)则回滚
   create trigger t_roll_Student
 on Student
   for update
    as
 if update(StudentName)
    rollback tran

--禁用、启用触发器

--禁用:
    alter table 表名 disable trigger 触发器名称
--启用:
    alter table 表名 enable  trigger 触发器名称
--重命名触发器
  exec sp_rename 原名称, 新名称

 

----因本例所以没能写插入触发器
 --假如一张学生表 另一张BorrowRecord为借书证表
 --要在增加一个学生时因在BorrowRecord表里增加一条记录的话则需要建触发器

------创建一个触发器(增加学生表中的学生时 同时增加学生借书证表中的记录)
    -------------------------------------------------------
    --Name:t_add_Student
    --func:增加BorrowRecord 的记录,与Student同步。
    --Use :None
    --User:System
    --Author:  
    --Date  :  2009-12-26 
    -------------------------------------------------------
 
----触发器增加
 Create Trigger t_add_Student
      On Student
      for insert
    As
      begin
          declare @newid varchar(50)  
          select  @newid=StudentID from Inserted --得到插入的ID
          insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(@newid,getdate(),getdate())
      end     

--测试
insert into Student(StudentID,StudentName) values(2009001004,'小王')



最后

以上就是平淡大炮为你收集整理的sql server2008 触发器的全部内容,希望文章能够帮你解决sql server2008 触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部