e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> DB2教程 >> INSTEAD OF 触发器 >> 教程正文
 
教程搜索
 
 
相关教程
  • 数据挖掘器: 警告 — 及时采取行动
  • UNIX、Linux 和 Windows 的生动简介
  • “总览图”: IBM DB2 通用数据库和信息
  • DB2 大事记
  • 数据管理部门副总裁兼 CTO:Don Hader
  • IBM 联邦数据库技术
  • 唐纳德.海德勒(Donald J. Haderle)
  • 数据库未来展望
  • 哪一个分布式 DB2 UDB V8 版本适合您?
  • 从数据管理到信息集成: 自然的演变
  • 联邦 - 数据库互操作性(第 1 部分)
  • 成功是必然的(中)
  • 成功是必然的(上)
  • 成功是必然的(下)
  • DB2 信息集成: 总览图
  • IBM 杰出工程师兼信息集成主管 Nelson
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
INSTEAD OF 触发器
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9
CREATE VIEW V5(c1, c2) AS SELECT c2, c1 FROM T1 UNION ALL SELECT c1, c2 FROM T2$

DB2 必须同时将 T2.c1 和 T1.c1 的数据类型转换为 FLOAT。V5.c1 和 V5.c2 现在都基于表达式,因此它们是不可更新的。但是,V5 仍然是可删除的。

CREATE VIEW V6(c1, c2) AS SELECT c1, c2 FROM T1 UNION ALL SELECT c1, c2 FROM T1$

象 V6 这样的视图也可称为“菱形”,因为处理从一个源分散为两个操作(SELECT),然后再返回到一起(UNION ALL)。菱形是只读的。不能删除行。原因在于 T1 中的每一行在 V6 中被表示了两次。因此在 V6 中不可能只删除一行。另外也不可能只更新一行。

当使用 UNION(或 DISTINCT)时会出现相反的问题。现在可以将视图中的每一行映射到基本表中可能的许多行。应当只删除基本表中的一行还是删除基本表中的所有匹配行?

我们已经讨论了一些不同类型视图的可更新性背后的想法。其它视图是不可更新的;但是,让我们将目光转向视图可更新性的重要“武器”:INSTEAD OF 触发器。

INSTEAD OF 触发器

视图是由其主体定义的。对于 SELECT 查询而言这一点非常明显。对于我们在上面所讨论的 UPDATE、DELETE 和 INSERT 而言,尽管对于某些类有可能假设视图如何定义明显的语义,而在大多数情况下无法做到这一点。这就是 INSTEAD OF 触发器的突破口。INSTEAD OF 触发器阻止 DB2 去尝试解释更新操作的视图定义。与此“相反”,它将执行触发器主体,依靠定义者来得出有意义的语义。

例如:

CREATE VIEW V7(c1, c2) AS SELECT DISTINCT c1, c2 FROM T1$

可以将 INSTEAD OF 触发器定义成删除 T1 中与 V7 中给定行相匹配的所有行或者根据某条预定规则仅删除一行。

让我们定义一个触发器,它删除基本表中所有的匹配行:

CREATE TRIGGER V7_DELETE INSTEAD OF DELETE ON V7 REFERENCING OLD_TABLE AS OLD_TAB OLD AS O FOR EACH ROW MODE DB2SQL DELETE FROM T1 WHERE o.c1 = c1 AND o.c2 = c2$

从表面上看,与普通触发器相比,只有两个子句发生了变化。首先我们定义了关键字 INSTEAD OF。其次我们指定了视图名而不是基本表名。

INSTEAD OF 是一个非常清晰的子句。它并不表示在试图进行删除操作之前执行触发器。也不表示在进行删除操作之后执行触发器。按照字面意思,就是表示忘掉删除操作。转而执行这段代码。


INSTEAD OF 触发器总是为视图而创建的,永远不是为基本表或别名而创建的。DB2 V8 中的 INSTEAD OF 触发器始终是 FOR EACH ROW 触发器。这意味着针对每个可以对视图进行删除、更新或插入操作的行,都要执行一次这个触发器。

该触发器中转换表和转换变量的概念与普通触发器中的概念一致。下面的 表 1显示了根据 INSTEAD OF 触发器的类型,可以在哪里使用转换变量和转换表:

表 1. 转换变量

OLD OLD_TABLE NEW NEW_TABLE INSERT NO NO YES YES UPDATE YES YES YES YES DELETE YES YES NO NO

OLD_TABLE 和 NEW_TABLE 转换表指定了由视图处理的行集。OLD 和 NEW 转换变量是由当前对触发器的调用所处理的各自转换表中的特定行。

在 DELETE 或 UPDATE 触发器中,OLD_TABLE 是符合删除条件的行集。这表示它们是视图上的游标能够看到的行。下面是我们示例中的 OLD_TABLE 值:

OLD_TAB: C1 C2 --- ---- 5 6.0 6 7.0

触发器处理行的顺序是任意的。这意味着没有规定上面的触发器先将(5, 6.0)还是先将(6, 7.0)看作 OLD 转换行。还有一点需要注意,对于所有触发器(包括 INSTEAD OF 触发器),转换表是在触发器被触发之前完全确定好的。这意味着我们可以在 T1 中进行删除,而不会看到 OLD_TABLE 中的更改。

请注意,上面的触发器在触发操作中不能有 WHEN 子句。INSTEAD OF 触发器是无条件触发的。对于 BEFORE 和 AFTER UPDATE 触发器的典型列列表而言也是如此。这些也是一种触发器条件,而 INSTEAD OF 触发器不会考虑它们。

CREATE TRIGGER V7_UPDATE INSTEAD OF UPDATE ON V7 REFERENCING NEW AS n OLD AS o FOR EACH ROW MODE DB2SQL UPDATE T1 SET (c1, c2) = (n.c1, n.c2) WHERE c1 = o.c1 AND c2 = o.c2$

无论更新哪一列都会触发该触发器。

图 1显示了 INSTEAD OF 触发器的完整语法图:

图 1. INSTEAD OF 触发器的语法图

>>-CREATE TRIGGER-- trigger-name--INSTEAD OF--+-INSERT-+--ON-- view-name-------> +-DELETE-+ '-UPDATE-' >-----+---------------------------------------------------------------------+> | .----------------------------------. | | V .-AS-. | | '-REFERENCING---+-OLD--+----+-- correlation-name-+-+-+---------------+-' | .-AS-. | +-NEW-+----+-- correlation-name--+ | .-AS-. | +-OLD_TABLE-+----+-- identifier--+ | .-AS-. | '-NEW_TABLE-+----+-- identifier--' >----FOR EACH ROW---MODE DB2SQL---- SQL-procedure-statement------------------><


注: DB2 V8.1 文档显示需要 DEFAULTS NULL 子句。这个子句在 V8.1 中已经 除去了。请参阅下面的 异常表示例以获取 INSTEAD OF 触发器上下文中缺省值的行为。 SQL-procedure-statement 可以是 SQL 语句(比如 INSERT、UPDATE、DELETE、SELECT 或 VALUES),也可以是使用 BEGIN ATOMIC ... END 的动态复合语句。 通过示例进行学习 理论到此结束。让我们研究一下您在实际生活中可能会碰到的某些示例。 垃圾箱 INSTEAD OF 触发器编写得好坏都取决于您自己。视图定义和 INSTEAD OF 触发器之间的唯一联系在于转换表的行定义(特征符),这些表的列类型和名称与从视图查询中继承的列类型和名称相

上一页  1 2 3 4 5 6 下一页
  • 上一篇教程: Terry Purcell 谈外连接(第二部分)
  • 下一篇教程: 使用连接的应用程序标识
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.