在DB2中创建第一个触发器(1)

发表于:2007-07-13来源:作者:点击数: 标签:
简介 当特定事件在 IBM DB2 Universal Database 数据库 中发生时,您就可以激活 触发器 来执行其他一些操作。在本文中,您将在触发器的世界里遨游,看看如何通过触发器来增强数据库中的业务规则。您还将学习如何使用 DB2 UDB Version 8.1 的控制中心来帮助您

简介

当特定事件在 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 表:

db2 => create table accttable(ssn varchar(30) not null primary key, 

lastname varchar(30) not null, firstname varchar(30) not null, 

savingbalance decimal(7,2) not null, checkingbalance decimal(7,2) not null)

现在向所创建的表中加入两条记录:

db2 => insert into accttable values

('111-11-1111','Bhogal','Kulvir',1500.00,1000)

db2 => insert into accttable values

('222-22-2222','Guy','Someother',2000.00,4000)

触发器可以在对表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前之后启动。在我们的例子中,您将创建一个在对ACCTTABLE 表执行 UPDATE 操作之前启动的触发器。在触发器术语中,INSERT、 DELETE 或者 UPDATE 这些使得触发器启动的事件被称作 触发事件。触发器的启动是在触发事件之前还是之后则称为触发器的 激活时间

使用 Control Center 创建触发器

打开 DB2 Control Center 开始创建触发器,展开您创建的数据库(即 bnkdb),鼠标右键点击 Triggers 选项并且选择 Create.....

图 1. 创建触发器

Figure 1.

Create Trigger 屏幕中,可以指定触发器所在的模式。请选择 DB2ADMIN 模式。记住,触发器是与表相关的,所以我们需要选择相关表的模式。然后请再次选择 DB2ADMIN 模式:

图 2. 选择模式

Figure 2.

在同一个屏幕中, 需要指定一个触发器的名字。将触发器命名为 OVERDRAFT。而且,需要指定与该触发器相关的表的名字。这里选择您创建的 ACCTTABLE

图 3. 选择您创建的表

Figure 3.

Time to trigger action区域中,选择 Before

图 4. 选择 Before

Figure 4.

Operation that causes the trigger to be executed区域中选择 Update of columns 操作并且指定被操作列为 CHECKINGBALANCE

图 5.

Figure 5. Specify the column name

点击 Triggered action标签页来创建该触发器:

图 6. 构建触发器

Figure 6.

指定临时变量

DB2 UDB 能够跟踪在启动触发器的那条语句之前和之后的一行的状态。请在 Correlation name for the old rows 一栏中填入 OLDROW,Correlation name for the new rows 一栏中填入 NEWROW

图 7. 指定 NEWROW

Figure 7.

注意,您也许无法指定其中的一个 correlation name,因为它依赖于引起触发器启动的特定操作和激活时间的组合。例如,假设您的触发器选择的 Time to trigger actionBefore,触发事件是 DELETE 语句。在这种情况下,我们就无法指定一个 "Correlation name for the new rows"。为什么呢?因为在执行了一个删除操作以后,新行是不存在的。

因为您创建的触发器是在 UPDATE 之前被激活,所以不能编辑 Temporary table for the old rowsTemporary table for the new rows选项。

您将注意到,在这种情况下(一个在 UPDATE 之前被激活的触发器),您只能指定触发器针对 而不是针对每个 语句触发。



  

原文转自:http://www.ltesting.net