posts - 97,  comments - 93,  trackbacks - 0

简介

当特定事件在 IBM® DB2® Universal Database™ 数据库中发生时,您就可以激活 触发器来执行其他一些操作。在本文中,您将在触发器的世界里遨游,看看如何通过触发器来增强数据库中的业务规则。您还将学习如何使用 DB2 UDB Version 8.1 的控制中心来帮助您创建一个应用于简单业务场景的简单触发器。

什么是触发器

当一个指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某张表时,一个定义了一组操作的触发器就可以被激活。触发器并不像参照完整性约束和检查约束那样,我们甚至可以使用对其他表来进行更新。

业务场景

将一项技术应用于真实世界的一个场景总是有益的。出于教学的目的,让我们在一个银行相关环境中研究触发器,在该模拟环境中,我们仅仅建立了一张表。再次强调,这是被简化了的!我们将要做的是,运用触发器来促进银行提供的透支保护。例如,一个银行客户有一个支票帐户(checking account)和一个储蓄帐户(saving account)。当从支票帐户中取款的金额超过了该帐户的余额时,就会发生一次自动的转帐(叫做透支保护),即自动从客户的储蓄帐户转帐过来。当然,这必须符合一定的条件,即储蓄帐户中必须有足够多的钱来补偿透支的金额。

开始

像上面所提及的,我们的银行仅仅包含一张表。在这张表中,我们将存入客户的支票帐户和储蓄帐户的余额等信息。每个客户通过其社会保险号码来标识。下面是对该表的描述:

表 1. 对 ACCTTABLE 的描述

Column Name Column Type Nullable? SSN*Varchar(11)NOLastNameVarchar(30)NOFirstNameVarchar(30)NOSavingBalanceDecimal (Precision: 7, Scale: 2)NOCheckingBalanceDecimal (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. 创建触发器

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

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

图 2. 选择模式

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

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

图 3. 选择您创建的表

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

在 Time to trigger action区域中,选择 Before。

图 4. 选择 Before

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

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

图 5.

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

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

图 6. 构建触发器

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

指定临时变量

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

图 7. 指定 NEWROW

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

注意,您也许无法指定其中的一个 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 之前被激活的触发器),您只能指定触发器针对 每 行而不是针对每个 语句触发。

 

简介

当特定事件在 IBM® DB2® Universal Database™ 数据库中发生时,您就可以激活 触发器来执行其他一些操作。在本文中,您将在触发器的世界里遨游,看看如何通过触发器来增强数据库中的业务规则。您还将学习如何使用 DB2 UDB Version 8.1 的控制中心来帮助您创建一个应用于简单业务场景的简单触发器。

什么是触发器

当一个指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某张表时,一个定义了一组操作的触发器就可以被激活。触发器并不像参照完整性约束和检查约束那样,我们甚至可以使用对其他表来进行更新。

业务场景

将一项技术应用于真实世界的一个场景总是有益的。出于教学的目的,让我们在一个银行相关环境中研究触发器,在该模拟环境中,我们仅仅建立了一张表。再次强调,这是被简化了的!我们将要做的是,运用触发器来促进银行提供的透支保护。例如,一个银行客户有一个支票帐户(checking account)和一个储蓄帐户(saving account)。当从支票帐户中取款的金额超过了该帐户的余额时,就会发生一次自动的转帐(叫做透支保护),即自动从客户的储蓄帐户转帐过来。当然,这必须符合一定的条件,即储蓄帐户中必须有足够多的钱来补偿透支的金额。

开始

像上面所提及的,我们的银行仅仅包含一张表。在这张表中,我们将存入客户的支票帐户和储蓄帐户的余额等信息。每个客户通过其社会保险号码来标识。下面是对该表的描述:

表 1. 对 ACCTTABLE 的描述

Column Name Column Type Nullable? SSN*Varchar(11)NOLastNameVarchar(30)NOFirstNameVarchar(30)NOSavingBalanceDecimal (Precision: 7, Scale: 2)NOCheckingBalanceDecimal (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. 创建触发器

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

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

图 2. 选择模式

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

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

图 3. 选择您创建的表

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

在 Time to trigger action区域中,选择 Before。

图 4. 选择 Before

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

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

图 5.

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

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

图 6. 构建触发器

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

指定临时变量

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

图 7. 指定 NEWROW

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

注意,您也许无法指定其中的一个 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 之前被激活的触发器),您只能指定触发器针对 每 行而不是针对每个 语句触发。

posted on 2007-08-02 11:24 wqwqwqwqwq 阅读(353) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234




常用链接

留言簿(10)

随笔分类(95)

随笔档案(97)

文章档案(10)

相册

J2ME技术网站

java技术相关

mess

搜索

  •  

最新评论

阅读排行榜

校园梦网网络电话,中国最优秀的网络电话