简介
当特定事件在 IBM® DB2® Universal Database™ 数据库中发生时,您就可以激活 触发器来执行其他一些操作。在本文中,您将在触发器的世界里遨游,看看如何通过触发器来增强数据库中的业务规则。您还将学习如何使用 DB2 UDB Version 8.1 的控制中心来帮助您创建一个应用于简单业务场景的简单触发器。
什么是触发器
当一个指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某张表时,一个定义了一组操作的触发器就可以被激活。触发器并不像参照完整性约束和检查约束那样,我们甚至可以使用对其他表来进行更新。
业务场景
将一项技术应用于真实世界的一个场景总是有益的。出于教学的目的,让我们在一个银行相关环境中研究触发器,在该模拟环境中,我们仅仅建立了一张表。再次强调,这是被简化了的!我们将要做的是,运用触发器来促进银行提供的透支保护。例如,一个银行客户有一个支票帐户(checking aclearcase/" target="_blank" >ccount)和一个储蓄帐户(saving account)。当从支票帐户中取款的金额超过了该帐户的余额时,就会发生一次自动的转帐(叫做透支保护),即自动从客户的储蓄帐户转帐过来。当然,这必须符合一定的条件,即储蓄帐户中必须有足够多的钱来补偿透支的金额。
开始
像上面所提及的,我们的银行仅仅包含一张表。在这张表中,我们将存入客户的支票帐户和储蓄帐户的余额等信息。每个客户通过其社会保险号码来标识。下面是对该表的描述:
表 1. 对 ACCTTABLE 的描述
Column Name | Column Type | Nullable? |
SSN* | Varchar(11) | NO |
LastName | Varchar(30) | NO |
FirstName | Varchar(30) | NO |
SavingBalance | Decimal (Precision: 7, Scale: 2) | NO |
CheckingBalance | Decimal (Precision: 7, Scale: 2) | NO |
请使用 DB2 命令行处理器为上面的表创建一个数据库。将数据库命名为 bnkdb。
db2 => create database bnkdb
接下来,连接到该数据库。我假设您已经在您的机器上有了一个用户名为 db2admin
,
密码为 db2admin
的帐号。
db2 => connect to bnkdb user db2admin using db2admin
现在,创建 accttable
表:
|
现在向所创建的表中加入两条记录:
|
|
触发器可以在对表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后启动。在我们的例子中,您将创建一个在对ACCTTABLE 表执行 UPDATE 操作之前启动的触发器。在触发器术语中,INSERT、 DELETE 或者 UPDATE 这些使得触发器启动的事件被称作 触发事件。触发器的启动是在触发事件之前还是之后则称为触发器的 激活时间。
使用 Control Center 创建触发器
打开 DB2 Control Center 开始创建触发器,展开您创建的数据库(即 bnkdb),鼠标右键点击 Triggers 选项并且选择 Create.....
图 1. 创建触发器
在 Create Trigger 屏幕中,可以指定触发器所在的模式。请选择 DB2ADMIN 模式。记住,触发器是与表相关的,所以我们需要选择相关表的模式。然后请再次选择 DB2ADMIN 模式:
图 2. 选择模式
在同一个屏幕中, 需要指定一个触发器的名字。将触发器命名为 OVERDRAFT。而且,需要指定与该触发器相关的表的名字。这里选择您创建的 ACCTTABLE。
图 3. 选择您创建的表
在 Time to trigger action区域中,选择 Before。
图 4. 选择 Before
在 Operation that causes the trigger to be executed区域中选择 Update of columns 操作并且指定被操作列为 CHECKINGBALANCE:
图 5.
点击 Triggered action标签页来创建该触发器:
图 6. 构建触发器
指定临时变量
DB2 UDB 能够跟踪在启动触发器的那条语句之前和之后的一行的状态。请在 Correlation name for the old rows 一栏中填入 OLDROW,
在 Correlation name for the new rows 一栏中填入 NEWROW
:
图 7. 指定 NEWROW
注意,您也许无法指定其中的一个 correlation name,因为它依赖于引起触发器启动的特定操作和激活时间的组合。例如,假设您的触发器选择的 Time to trigger action 是 Before,触发事件是 DELETE 语句。在这种情况下,我们就无法指定一个 "Correlation name for the new rows"。为什么呢?因为在执行了一个删除操作以后,新行是不存在的。
因为您创建的触发器是在 UPDATE 之前被激活,所以不能编辑 Temporary table for the old rows 和 Temporary table for the new rows选项。
您将注意到,在这种情况下(一个在 UPDATE 之前被激活的触发器),您只能指定触发器针对 每 行而不是针对每个 语句触发。