• 如何在SQL Server中使用触发器


    触发器是一种特殊的存储过程,在使用触发器之前可以与存储过程进行比较,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。

      触发器主要优点如下
      触发器是自动的:当对表中的数据作了任何修改之后立即被激活,触发器与数据库中的表紧密相关,比如当对表执行INSERT、UPDATE或DELETE操作时,触发器就会自动执行。
      触发器可以对数据库中的表进行嵌套的触发,一个触发器执行启动另一个触发器的操作,这样的嵌套可以达到32层。
      触发器可以强制限制,可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制,虽CHECK约束已经在表定义的时候建立好了,但触发器可以实现很多其它的约束限制,在约束所支持的功能无法满足应用程序的功能要求时,触发器的优点就会体现。
      在SQL Server中,已经包括两大类触发器:DML 触发器和 DDL 触发器。 DDL触发器为SQL Server 2005中新增的。
      当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误,则整个事务即自动回滚。
      DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库中执行管理任务,例如,审核以及规范数据库操作。像常规触发器一样,DDL 触发器将激发存储过程以响应事件。但与 DML 触发器不同的是,它们不会为响应针对表或视图的 UPDATE、INSERT 或 DELETE 语句而激发。相反,它们会为响应多种数据定义语言 (DDL) 语句而激发。这些语句主要是以 CREATE、ALTER 和 DROP 开头的语句。DDL 触发器可用于管理任务,例如审核和控制数据库操作。
      了解到以上内容,我们就来看一下如何来创建一个DML触发器和一个DDL触发器。
      在SQL Server 2000中我们创建触发器可以通过在表名上点右键->“所有任务”->“管理触发器”来创建,然后在里面写上对应的 T-SQL 语句,也可以在查询分析器里面创建。在SQL Server 2005中就不提供对应的表名进行操作了,需要直接通过写对应的T-SQL语句了。
      触发器的操作命令主要有如下几种格式:
      创建触发器:
      Create Trigger 名称
      On 表名
      For 类型
      As
      Sql语句
      修改触发器:
      Alter Trigger 名称
      删除触发器:
    Drop Trigger 名称
      先来看一个DML触发器:
      现在有两张表,一张是学生的基本信息表,一张是他所借书的表(表里面和学生基本信息表关联的是学号),现在业务如下:更改了学生的学号,同时也要更改所借书表的学号;该学生毕业后,删除他的学号时,同时也删除它的借书的记录。
      我们就来创建这样的触发器,先来描述更改学生的学号同时更改所借书的学号: 

    Create Trigger TrgStudentInfoUpdate
    On StudentInfo --在StudentIno表中创建触发器
    For Update --为更新事件触发
    As
    if Update(StudentNumber) --更新了学号后
    Begin
    Update BorrowBook --更新借书的记录表
    Set StudentNumber=StudentInfo.StudentNumber
    From BorrowBook , StudentInfo
    Where BorrowBook.StudentNumber=StudentInfo.StudentNumber
    End

     然后再来看看删除学号时同时删除它的借书记录:

    Create trigger TrgStudentInfoDelete

    On StudentInfo --在StudentIno表中创建触发器

    For Delete --为删除事件触发

    As

    Delete BorrowBook --删除学生信息时同时删除他的借书记录表信息

    From BorrowBook, StudentInfo

    Where BorrowBook.StudentNumber=StudentInfo.StudentNumber

     

    以上就是DML的触发器,下面来看DDL的触发器,我们可以看SQL Server 2005自带的一个例子的用法:CREATE TRIGGER safety

    ON DATABASE

    FOR DROP_TABLE, ALTER_TABLE –-在删除或对表进行更新时

    AS

    PRINT 'You must disable Trigger "safety" to drop or alter tables!' –-提示信息

    ROLLBACK –-回滚

        以上示例说明了如何使用 DDL 触发器来防止数据库中的任一表被修改或删除,当任何一张表在被修改或删除的时候,都会触发到相应的事件。
      触发器在给我们带来操作方便的同时,也需要慎用它,如果过分的依赖触发器,很大程度上就会影响到数据库的结构,增加了维护的复杂度。

  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/majunfeng/p/3933858.html
Copyright © 2020-2023  润新知