创建与删除触发器
被考次数: 9次
被考频率: 中频率
答错率:    48%
知识难度:
考试要求: 掌握     
知识路径:  > 数据库技术  > 数据库标准语言—SQL  > 触发器


本知识点历年真题试卷分布
>> 试题列表    
 

 
       触发器(Trigger)不仅能实现完整性规则,而且能保证一些较复杂业务规则的实施。对于示警或满足特定条件下自动执行某项任务来讲,触发器是非常有用的机制。所谓触发器就是一类由事件驱动的特殊过程,一旦由某个用户定义,任何用户对该触发器指定的数据进行增加、删除或修改操作时,系统将自动激活相应的触发器,在核心层进行集中的完整性控制。
       尽管在SQL-99前,触发器不是SQL标准的一部分,但是以SQL为基础的数据库广泛应用了触发器。但是,由于不同的数据库系统使用各自的触发器语法,以至于产生相互之间不兼容的问题。
          概述
          触发器是一种特殊类型的存储过程,它不同于前面介绍过的存储过程,是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。触发器使每个站点在有数据修改时自动强制执行其业务规则,并且可以用于SQL Server约束、默认值和规则的完整性检查。
          触发器主要有如下三方面的特点:
          (1)当数据库程序员声明的事件发生时,触发器被激活。事件可以是对某个特定关系的插入insert、删除delete或更新update。
          (2)当触发器被事件激活时,不是立即执行,而是首先由触发器测试触发条件,若条件不成立,响应该事件的触发器什么事情都不做。
          (3)如果触发器声明的条件满足,则与该触发器相连的动作由DBMS执行。动作可以阻止事件发生,可以撤销事件。
          注意:触发器为数据库对象,当创建一个触发器时必须指定:①名称;②在其上定义触发器的表;③触发器将何时激发;④指明触发器执行时应做的动作。其名称必须遵循标识符的命名规则,数据库像存储普通数据那样存储触发器。触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。尽管不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。
          触发动作实际上是一系列SQL语句,可以有两种方式:
          (1)对被事件影响的每一行(FOR EACH ROW)——每一元组执行触发过程,称为行级触发器。
          (2)对整个事件只执行一次触发过程(FOR EACH STATEMENT),称为语句级触发器。该方式是触发器的默认方式。
          创建触发器
          对于示警或满足特定条件下自动执行某项任务来讲,触发器是非常有用的机制。其定义包括两个方面:指明触发器的触发事件,指明触发器执行的动作。
          触发事件包括表中行的插入、删除和修改,即执行INSERT、DELETE、UPDATE语句。在修改操作(UPDATE)中,还可以指定特定的属性或属性组的修改为触发条件。事件的触发还有两个相关的时间:Before和After。Before触发器是在事件发生之前触发,After触发器是在事件发生之后触发。创建触发器语句格式如下:
          
          说明:
          (1)BEFORE:指示DBMS在执行触发语句之前激发触发器。
          (2)AFTER:指示DBMS在执行触发语句之后激发触发器。
          (3)DELETE:指明是DELETE触发器,每当一个DELETE语句从表中删除一行时激发触发器。
          (4)INSERT:指明是INSERT触发器,每当一个INSERT语句向表中插入一行时激发触发器。
          (5)UPDATE:指明是UPDATE触发器,每当UPDATE语句修改由OF子句指定的列值时,激发触发器。如果忽略OF子句,每当UDPATE语句修改表的任何列值时,DBMS都将激发触发器。
          (6)REFERENCING<临时视图名>:指定临时视图的别名。在触发器运行过程中,系统会生成两个临时视图,分别存放被更新值(旧值)和更新后的值(新值)。对于行级触发器,默认临时视图名分别是OLD和NEW;对于语句级触发器,默认临时视图名分别是OLD-TABLE和NEW-TABLE。一旦触发器运行结束,临时视图就不在。
          (7)WHEN<触发条件>:指定触发器的触发条件。当满足触发条件时,DBMS才激发触发器。触发条件中必须包含临时视图名,不包含查询。
          账户关系模式Account中的属性Account-no表示账号,branch-name表示支行名称,balance表示余额。贷款关系模式Loan中的属性Loan-no表示贷款号,branch-name表示支行名称,amount表示金额。存款关系模式depositor中的属性customer-name表示存款人姓名。SQL-99创建触发器如下所示:
          
          例8.29说明:When语句指定一个条件nrow.balance<0。仅对满足条件的元组才会执行余下的触发器;Begin atomic…end子句用来将多行SQL语句集成为一个复合语句,该子句中的两条Insert into语句执行了在borrower和loan关系中建立新的贷款业务;update语句用来将账户余额清零;Referencing old row as子句可以建立一个变量用来存储已经被更新或删除行的旧值。Referencing new row as子句可以被update、Insert语句使用。
          Referencing old table as或Referencing new table as子句可以用来指向临时表(也称过渡表)来容纳所有被影响的行。无论临时表是语句触发器还是行触发器,它们都不能用before触发器,但是可以用after触发器。
          触发器事件和动作可以有很多形式,除了update以外还可以是Insert、delete。例如,如果有一个新的用户存款插入时,触发器动作可以给用户发一封欢迎信。显然一个触发器不能直接对数据库之外的事情进行操作,但是它可以在存储待发欢迎信地址的关系中添加一个元组。一个专用进程会检查这个表,打印出要发出的欢迎信。
          触发器在事件(update、Insert和delete)之前被激发,而不是在事件之后。这种触发器可作为避免非法更新的额外约束。例如,有时用户不允许透支,此时,可以建立一个before触发器在新的余额是负数时回滚事务。
          更改和删除触发器
                更改触发器
                使用系统命令ALTER TRIGGER更改指定的触发器的定义,即更改原来由CREATE TRIGGER语句创建的触发器定义。更改触发器定义的语句格式如下:
                
             删除触发器
             语句格式:DROP TRIGGER<触发器名>[,…n]
             说明:n表示可以指定多个触发器的占位符。
 

更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2025 All Rights Reserved
软考在线版权所有