第十一章 管理触发器

触发器概念: 触发器是一种特殊类型的存储过程,它不同于普通的存储过程.触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用.当往一个表格中插入记录,修改记录或者删除记录时,sql server 就会自动执行触发器所定义的sql语句,以确保数据的完整性.

 

      与check约束相比,触发器可以强制实现更加复杂的数据完整性,而且可以参考其他表的字段.

      触发器可以扩展sql server约束,默认值和规则的完整性检查逻辑,但只要约束和默认值提供了全部所需的功能,就应使用约束和默认值

 

触发器的作用

      触发器可以使用t-sql语句进行复杂的逻辑处理,它基于一个表创建,但是可以对多个表进行操作,因此常常用于复杂的业务规则.

      1>级联修改数据库中相关的表

      2>执行比核查约束更为复杂的约束操作

      3>拒绝或回滚违反引用完整性的操作. (检查对数据表的操作是否违反引用完整性,并选择相应的操作.)

      4>比较表修改前后数据之间的差别,并根据差别采取相应的操作.

              例:若想规定每次工资的变动幅度不能超过40%,使用触发器可以将修改后的表数据和修改前的表数据进行比较,若超出40%,可以

              回滚该修改操作.

 

触发器的类型

     update触发器:在表上进行更新操作时触发

     insert触发器:在表上进行插入操作时触发

     delete触发器:在表上进行删除操作时触发

     after触发器:在一个触发动作发生之后激发,并提供一种机制以便控制多个触发器的执行顺序

                       要求只有执行某一操作之后(insert  update  delete)触发器才被触发,且只能在表上定义.可以为针对表的同一操作定义多

                       个触发器.对于after触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder

                       来完成此任务

     instead of 触发器: 并不执行其所定义的操作(insert  update  delete),而仅是执行触发器本身.既可以在表上定义instead of触发器,

                       也可以在视图上定义instead of触发器,但对同一个操作只能定义一个instead of触发器

 

触发器的主要优点

     触发器是自动的:当对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后,立即被激活

     触发器可以通过数据库中的相关表进行层叠更改

     触发器可以强制限制,这些限制比用check约束所定义的更复杂.而且比使用核查约束更为方便的是,触发器可以引用其他数据表中的列.

 

创建触发器的规则和限制

     1>create trigger语句必须是批处理中的第一个语句,且该批处理中随后出现的其他所有语句都将被解释为create trigger语句定义的一部

      分

      2>在默认情况下,创建触发器的权限将被分配给数据表的所有者,且不能将该权限转给其他用户

      3>触发器是数据库对象,其名称必须遵循标识符的 命名规则

      4>虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器

      5>虽然不能在临时数据库上创建触发器,但是触发器可以引用临时数据表

       6>既不能在系统数据表创建触发器,也不可以引用系统数据表

      7>在包含使用delete后update操作定义的外键的表中,不能定义instead of和instead of update触发器

      8>虽然truncate table语句类似于没有where子句(用于删除行)的delete语句,但它并不会引发delete触发器,因为truncate table

           语句没有被记入日志

      9>writetext语句不会引发insert或update触发器

       10>下列语句不可以用于创建触发器:alter database        create database      disk init         disk resize        drop

        database       load database       load log       reconfigure            restore database      restore log

        11>当创建一个触发器时必须指定 名称  在其上定义触发器的表   触发器将何时激发        及或触发器的数据修改语句

 

创建触发器  格式:createte trigger trigger_name on table | view [ with encryption ] { for | after | instead of } { [insert ] [,] [ update ] [,] [ delete ] } as sql_statements [...n]

各参数含义: table 用于用户创建的触发器相关联的表的名字,并且该表已经存在.

                 delete  insert  update 关键字用来指明哪种数据操作将激活触发器,至少要指明一个选项,在触发器的定义中三者的顺序不受限制,且各选项要用逗号隔开

                 after 表示只有在执行了指定的操作insert  delete  update之后触发器才能被激活,执行触发器中的sql语句.若使用关键字for,则表示为after触发器,且该类型触发器仅能在表上创建.

 

               例子: use company

                       go

                       create trigger 触发器_欢迎新员工

                       on employee

                       after insert

                       as

                       print '新员工加入本公司,欢迎欢迎!'

                       go

 

使用系统存储过程sp_helptrigger查看触发器相关数据

            exec sp_helptrigger 'table' [, 'type']

            type指定列出的操作的类型的触发器.若不指定,则列出所有的触发器

查看触发器的定义文本

            sp_helptext 'trigger_name'

查看触发器的所有者和创建日期

             exec sp_help 'trigger_name'

 

触发器更名

            sp_rename oldname,newname

删除触发器

             drop trigger trigger_name [,...]

             当删除数据表时,也将同时删除所有与该数据表相关联的触发器.而且当删除触发器时,系统也将从sysobjects和syscomments系

             统表中删除有关该触发器的信息

 

posted @ 2010-08-11 15:55  转航  阅读(182)  评论(0编辑  收藏  举报