winner

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

触发器简介

Posted on 2007-03-07 14:07  狂ミ风  阅读(562)  评论(0)    收藏  举报
触发器是一种特殊类型的存储过程,由一组SQL语句组成;它有助于更好地维护数据库的完整性。
触发器是依存于表的数据库对象,在表执行修改操作(插入/更新/删除)时自动执行,即是通过事件进行触发而被执行的.
  触发器功能:
(1)级联修改数据库中相关的表。
(2)执行比检查约束更为复杂的约束操作。
(3)拒绝或回滚违反引用完整性的操作。
(4)比较表修改前后数据之间的差别,并根据差别采取相应的操作。
  触发器类型:
AFTER触发器:
  这种触发器将在数据变动(insert,update,delete操作)完成以后才触发。对变动的数据进行检查,如果发现错误,则拒绝或回滚变动的数据。
INSTEAD OF触发器:
  这种触发器将在数据变动以前被触发。并取代变动数据 的操作(insert,update,delete操作),转而去执行触发器定义的操作。
  在建立触发器时,还必须指定触发操作: insert、update、delete操作,至少指定一种,也可指定多种。

          触发器结构

    事 件           条件           动作
UPDATE INSERT DELETE     AFTER INSTEAD OFF   各种Transact-SQL语句                   ↓           ↓
    触发事件发生       触发事件发生
      ↓            ↓
    执行触发事件       不执行触发事件
      ↓            ↓
    执行触发器动作      执行触发器动作
      ↓            ↓
After 条件触发器执行示意图  Instead of 条件触发器执行示意图

§7.2 管理触发器

一、 创建触发器
  在同一个数据表中可以创建多个after触发器,在表或视图上,每个insert、update、delete语句最多可以定义一个instead of触发器。
  创建触发器应该考虑以下几个问题:
  >CREATE TRIGGER 语句必须是批处理中的第一个语句。
  >创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
  >触发器为数据库对象,其名称必须遵循标识符的命名规则。
  >虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
  >虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。
  >在为某数据表创建外键约束时,选中‘级联删除相关字段’,不能定义 INSTEAD OF DELETE 触发器;选中‘级联更新相关字段’,不能定义 INSTEAD OF UPDATE 触发器。
  当创建一个触发器时必须指定:
  ⑴名称;
  ⑵在其上定义触发器的表;
  ⑶触发器将何时激发;
  ⑷激活触发器的数据修改语句。
1.使用企业管理器创建触发器:
2.使用CREATE TRIGGER命令创建触发器               

3.使用CREATE TRIGGER命令创建触发器
  语法参见教材或系统帮助
例:

二、 查看、修改和删除触发器

1. 查看触发器
(1)用企业管理器查看触发器信息

  如下图7-1所示:

  

图7-1

(2)使用系统存储过程查看触发器
  sp_help:用于查看触发器的一般信息,如触发器的名称、属性、类型和创建时间。
  sp_helptext:用于查看触发器的正文信息

如下图7-2所示:

图7-2

  sp_depends:用于查看指定触发器所引用的表或者指定的表涉及到的所有触发器。
2. 修改触发器
(1)使用企业管理器修改触发器正文(操作演示)
(2)使用sp_rename命令修改触发器的名称
sp_rename命令的语法形式如下: sp_rename oldname,newname
(3)使用alter trigger命令修改触发器正文
3. 删除触发器
(1)使用系统命令DROP TRIGGER删除指定的触发器,其语法形式如下:
  DROP TRIGGER { trigger } [ ,...n ]
(2)删除触发器所在的表时,SQL Server将会自动删除与该表相关的触发器。
(3)在企业管理器中删除触发器 

§7.3 触发器的应用

触发器补充知识:
  有两个触发器生成的临时表inserted 和deleted.
  在触发器执行时,将生成这两个临时表.
  两个临时表可以在SQL语句中引用,用于触发器条件的测试,但表中的内容不能修改.
  执行INSERT语句时,插入到表中的新记录也同时被插入到inserted表中;
  执行UPDATE语句时,系统首先删除原有记录,并将原有的记录行插入到表deleted,而新插入的记录也同时被插入到inserted表中;
  执行DELETE语句时,删除的记录也将被插入到deleted表中;

1. 创建AFTER INSERT触发器
例子7-1:在员工表中创建一个触发器,将新员工工资限制在不超过5000以内,若插入的员工工资超过5000,则拒绝插入该记录。

2. 创建AFTER UPDATE触发器
例子7-2:在员工表中创建触发器,限制每次工资额的变动不能超过2000.

3. 创建AFTER DELETE触发器
  考虑: 为了防止那些确实需要删除但会引起数据一致性问题的记录的删除。
例7-3:在'客户表'中创建一个触发器,监控删除的客户记录, 若删除的记录在'项目表'中有合作项目,且项目尚未完工,则不可删除,否则可以删除.

4. 创建INSTEAD OF触发器
  INSTEAD OF触发器可用来取代激活触发器的insert,update,delete操作,转而由触发器中的程序控制数据的修改.
  当INSTEAD OF触发器被激活时,inserted,deleted临时表都已存入数据.这与 AFTER触发器相同;差别在于AFTER触发器激活前,表中数据已修改,而INSTEAD OF触发器被激活时还未实际修改表中数据.

例7-4:假定有数据表employee,包含字段‘姓’、‘名’、‘工资’。基于该表创建了一个视图emp_view,包含字段‘姓名’、‘工资’两个字段,其中字段‘姓名’ 由基表的字段‘姓’和‘名’组合而来 ;(创建一个触发器,可实现通过视图插入一条记录)

5. 嵌套的触发器
  如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。