|
知识路径: > 数据库技术 > 数据库标准语言—SQL > 触发器 > 创建与删除触发器 >
|
相关知识点:4个
|
|
|
|
对于示警或满足特定条件下自动执行某项任务来讲,触发器是非常有用的机制。其定义包括两个方面:指明触发器的触发事件,指明触发器执行的动作。
|
|
|
触发事件包括表中行的插入、删除和修改,即执行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触发器在新的余额是负数时回滚事务。
|
|
|