
INSTEAD OF 触发器
热 荐
【字体:小 大】
INSTEAD OF 触发器
作者:- 文章来源:- 点击数:907 更新时间:2006-4-22 
Serge Rielau
DB2 SQL 查询编译器开发, IBM 多伦多实验室
2003 年 8 月 视图通常用来区分 DB2 逻辑模式和物理模式。本文估计哪些视图是可以自我更新的,然后为 DB2 通用数据库 V8.1 引入一个新的功能部件: INSTEAD OF 触发器,它使所有的视图都可以更新。
简介
视图通常用来区分逻辑数据库模式和物理模式。遗憾的是,在 UPDATE、DELETE 或 INSERT 操作中通常都达不到预期的透明度,因为除了最简单的视图之外所有的视图都不可更新。本文评估哪些视图自己是可更新的,然后引入 INSTEAD OF 触发器 - 这是 DB2® Universal Database™ V8.1 for Linux、UNIX® 和 Windows® 的新功能,它使所有视图都可以更新。
先决条件
本文中的许多示例都使用 SQL 过程化语言(SQL Procedural Language,SQL PL)。由于 SQL PL 在其主体中使用分号( ;)来分隔各个语句,所以对 CLP 或命令中心(Command Center)必须使用另一个定界符。在本篇文章中我将使用美元符号( $)来给语句定界。
要启动 CLP 会话以使用本文中的示例,请从 shell 输入: db2 -td$ 。对于命令中心,通过单击 Tools -> ToolsSettings -> Use statement termination character来设置并激活定界符。
纵览可更新视图
在我们向您完整地介绍可更新视图之前,我们需要基本了解一下“可更新”是什么意思以及 DB2(或就这一点而言的任何数据库管理系统)必须解决哪些基本问题才能通过视图更新数据库中的行。首先,缺省情况下 DB2 所拥有的全部视图信息就是视图的定义,即指定由该视图派生出的表的查询。
为了精确起见,我们需要区别三个级别的可更新能力:
可删除:为了从视图中删除一行,DB2 必须能够将视图中指定的那一行映射到基本表中有且仅有的一行。
可更新:为了更新视图中的列,DB2 必须不仅能够将视图中指定的一行映射到基本表中的一行,它还必须能够将要更新的一列映射到基本表中的一列。因此,根据定义所有可更新的视图必须是可删除的。
可插入:为了将行插入到视图中,DB2 必须能将新的行映射到一张表中并能够将指定的所有列映射到该表中的列。因此所有可插入的视图要定义成是可更新的,从而也是可删除的。
现在让我们定义一些表,然后研究这些表的各种视图的可更新能力:
CREATE TABLE T1(c1 INT, c2 FLOAT)$ INSERT INTO T1 VALUES (5, 6.0), (6, 7.0), (5, 6.0)$ CREATE TABLE T2(c1 INT, c2 FLOAT)$ INSERT INTO T2 VALUES (5, 9.0), (5, 4.0), (7, 5.0)$
