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
PERSONS_V REFERENCING OLD AS o NEW AS n FOR EACH ROW MODE DB2SQL BEGIN ATOMIC UPDATE PERSONS SET (ssn, name) = (n.ssn, n.name) WHERE ssn = o.ssn; IF n.university IS NOT NULL AND o.university IS NOT NULL THEN UPDATE STUDENTS SET (ssn, university, major) = (n.ssn, n.university, n.major) WHERE ssn = o.ssn; ELSEIF n.university IS NULL THEN DELETE FROM STUDENTS WHERE ssn = o.ssn; ELSE INSERT INTO STUDENTS VALUES(n.ssn, n.university, n.major); END IF; IF n.company IS NOT NULL AND o.company IS NOT NULL THEN UPDATE EMPLOYEES SET (ssn, company, salary) = (n.ssn, n.company, n.salary) WHERE ssn = o.ssn; ELSEIF n.company IS NULL THEN DELETE FROM EMPLOYEES WHERE ssn = o.ssn; ELSE INSERT INTO EMPLOYEES VALUES(n.ssn, n.company, n.salary); END IF; END$ 既然已经完整定义了视图,它包含了用于插入、删除和更新的触发器,那就让我们对其进行测试: INSERT INTO PERSONS_V VALUES (123456, 'Smith', NULL, NULL, NULL, NULL), (234567, 'Jones', 'Wmart', 20000, NULL, NULL), (345678, 'Miller', NULL, NULL, 'Harvard', 'Math'), (456789, 'McNuts', 'SelfEmp', 60000, 'UCLA', 'CS')$ SELECT * FROM PERSONS_V ORDER BY SSN$ SSN NAME COMPANY SALARY UNIVERSITY MAJOR ------ ------ -------- -------- ----------- ------ 123456 Smith - - - - 234567 Jones Wmart 20000.00 - - 345678 Miller - - Harvard Math 456789 McNuts SelfEmp 60000.00 UCLA CS 现在 Smith 先生结婚了,采用他妻子的姓“Johnson”,并且他以 15000 的工资被 Mickburgs 聘用,而 Miller 女士从 Harvard 毕业并被 IBM 聘用。 UPDATE PERSONS_V SET (name, company, salary) = ('Johnson', 'Mickburgs', 15000) WHERE SSN = 123456$ UPDATE PERSONS_V SET (company, salary, university) = ('IBM', 70000, NULL) WHERE SSN = 345678$ SELECT * FROM PERSONS_V WHERE SSN IN (123456, 345678) ORDER BY SSN$ SSN NAME COMPANY SALARY UNIVERSITY MAJOR ------ ------- -------- -------- ----------- ------ 123456 Johnson Mickburgs 15000 - - 345678 Miller IBM 70000 - - Jones 先生长期出国: DELETE FROM PERSONS_V WHERE NAME = 'Jones'$ 最后说明一点,在插入时我们可以省略值为 NULL 的列: INSERT INTO PERSONS_V(ssn, name) VALUES (567890, 'vanderpoor')$ 既然这么说了,那么谈论 DEFAULTS 就有意义了。我们将在下一个(也就是最后一个)示例中谈谈这一点及其它。 异常表处理 将数据插入表时,就会使用数据类型、BEFORE 触发器、检查约束和 RI 约束来限制用某种方式或其它方式插入的数据。SET INTEGRITY、LOAD 和 IMPORT 都允许用户通过将被拒绝的行存储到异常表中来处理有问题的数据。但是,INSERT 和 UPDATE 自身并没有办法可处理有问题的数据。应用程序负责尝试诸如插入之类的操作,如果失败了,就采取必要的步骤。不便之处在于两个方面:
  • 首先,处理不是封装的。
  • 其次,单行插入很浪费,即使通过存储过程完成时也是如此。
下面的示例使用一个 INSTEAD OF INSERT 触发器将有问题的行分派到另一个位置。 CREATE TABLE ADDRESSES(name varchar(10), number INT, street varchar(20), country VARCHAR(10) WITH DEFAULT 'CANADA')$ CREATE TABLE BAD_ADDRESSES AS (SELECT CAST(NULL AS VARCHAR(30)) AS Reason, A.* FROM ADDRESSES A) DEFINITION ONLY$ CREATE VIEW ADDRESSES_V AS SELECT * FROM ADDRESSES$ CREATE TRIGGER INSERT_ADDRESSES_V INSTEAD OF INSERT ON ADDRESSES_V REFERENCING NEW AS n FOR EACH ROW MODE DB2SQL BEGIN ATOMIC DECLARE reason VARCHAR(30); SET reason = CASE WHEN n.number IS NULL OR n.number <= 0 THEN 'Number' WHEN n.name IS NULL OR LENGTH(n.name) = 0 THEN 'Name' WHEN n.street IS NULL OR LENGTH(n.street) = 0 THEN 'Street' WHEN country IS NULL OR country NOT IN ('CANADA', 'USA', 'GERMANY', 'FRANCE') THEN 'Country' ELSE NULL END; IF reason IS NOT NULL THEN INSERT INTO BAD_ADDRESSES VALUES(reason, n.name, n.number, n.street, n.country); ELSE INSERT INTO ADDRESSES VALUES(n.name, n.number, n.street, n.country); END IF; END$ 上面的触发器将把好的数据和有问题的数据分隔开来,并存储相应的地址。但是这个示例还说明了其它更多的东西。 请注意,当前的 DB2 V8 文档规定 INSTEAD OF 触发器应当将列的所有 DEFAULT 值看成 NULL,这一点很重要。这个行为是由于 DB2 V8 Beta 测试版的客户反馈而进行的更改,因此从 INSTEAD OF 触发器规范中删除了 DEFAULTS NULL 子句。 当定义视图时,对于可更新列从底层表中继承其列的缺省值。如果列(在没有 INSTEAD OF 触发器的帮助下)是不可更新的,那么认为 DEFAULT 为 NULL。在本例中,如果没有指定国家或地区(country),或者如果使用了关键字 DEFAULT,那么 INSTEAD OF 触发器将获取“CANADA”。对于其它所有列该触发器将获取 NULL。 INSERT INTO ADDRESSES_V VALUES ('Jones', 510, 'Yonge St.', DEFAULT), ('Smith', -1, 'Nowhere', 'USA'), (NULL, 38, 'Am Feldweg', 'GERMANY'), ('Poubelle', 23, 'Rue de Jardin', 'FRANCE')$ SELECT * FROM ADDRESSES ORDER BY name$ NAME NUMBER STREET COUNTRY ---------- ------ -------------- ------- Jones 510 Yonge St. CANADA Poubelle 23 Rue de Jardin FRANCE SELECT * FROM BAD_ADDRESSES ORDER BY name$ REASON NAME NUMBER STREET COUNTRY ------ ------- ------ ----------- ------- Number Smith -1 Nowhere USA Name - 38 Am Feldweg GERMANY 可以轻松地调整该触发器以忽略有问题的行而不是将它们存储起来。 更多想法…… INSTEAD OF 触发器的其它应用可能有:

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

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

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