WEB开发网
开发学院数据库DB2 DB2 9.5 SQL Procedure Developer 认证考试 735 准... 阅读

DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第4部分:触发器

 2010-02-18 15:01:13 来源:WEB开发网   
核心提示:用触发器处理XML数据CREATE TRIGGER 可用于针对XML列创建 BEFORE和AFTER UPDATE触发器,此外,DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第4部分:触发器(4),您可以针对拥有XML列的表创建 INSERT或DELETE触发器,针对预定义的X

用触发器处理XML数据

CREATE TRIGGER 可用于针对XML列创建 BEFORE和AFTER UPDATE触发器。此外,您可以针对拥有XML列的表创建 INSERT或DELETE触发器。

针对预定义的XML模式验证XML文档始终是确保数据完整性的优秀实践。BEFORE触发器可以首先自动验证XML文档,然后再更新或插入到带有XML数据类型的列。如果不需要自动验证XML,则可以针对XML列使用BEFORE触发器的WHEN 子句。您可以设置一个条件,这样 XML文档就被设置为 VALIDATED 或者不能由将要激活的触发器执行验证。

清单 7将显示如何创建 BEFORE触发器???从而在将 XML文档插入到purchaseorder表之前先进行验证。该触发器总是在更新 XML文档之前激活的。

注:引用XML模式的任何一个触发器都与该模式存在依赖关系。在引用XML模式之前,必须先在XML模式库中注册该模式。如果稍后从 XML模式库中删除触发器依赖的XML模式,则触发器将被标记为无效。

清单 7. 创建触发器以验证XML文档中的数据CREATE TRIGGER new_order
  BEFORE INSERT ON purchaseorder
  REFERENCING NEW AS n
  FOR EACH ROW
   SET (n.porder) = xmlvalidate(n.porder
   ACCORDING TOXMLSCHEMA URI 'http://posample.org/order.xsd')

使用SQL PL语句扩展触发器主体

清单 8中的语法图列出了一些 SQL PL语句,可用于扩展触发器主体,从而提供更复杂的逻辑情形:

清单 8. CREATE TRIGGER 的一般语法图(续)

General Syntax Diagram for CREATE TRIGGER cont. 
SQL-procedure-statement

|--+-CALL----------------------------------------------+--------|
  +-Compound SQL (Dynamic)----------------------------+
  +-FOR-----------------------------------------------+
  +-+-----------------------------------+--fullselect-+
  | |    .-,-----------------------. |       |
  | |    V             | |       |
  | '-WITH----common-table-expression-+-'       |
  +-GET DIAGNOSTICS-----------------------------------+
  +-IF------------------------------------------------+
  +-INSERT--------------------------------------------+
  +-ITERATE-------------------------------------------+
  +-LEAVE---------------------------------------------+
  +-MERGE---------------------------------------------+
  +-searched-delete-----------------------------------+
  +-searched-update-----------------------------------+
  +-SET Variable--------------------------------------+
  +-SIGNAL--------------------------------------------+
  '-WHILE---------------------------------------------'

清单 9将演示如何从触发器主体中嵌入 CALL语句,调用存储过程。在本例中,参数是通过值传递给调用的过程 write_audit 的。这个简单示例将演示从触发器调用存储过程的好处。您现在应当能够使用SQL PL语句扩展触发器主体并实现更复杂的逻辑。

清单 9. 从触发器中调用存储过程

CREATE PROCEDURE write_audit( IN p_empno  CHAR(6),
               IN p_txt   CHAR(6),
               IN p_salary DECIMAL(9,2),
               IN p_user  CHAR(8),
               IN p_curtime TIMESTAMP )
BEGIn
 INSERT INTO audit_emp VALUES ( p_empno, p_txt, p_salary, p_user, p_curtime )
END 

CREATE TRIGGER new_emp
 AFTER INSERT ON employee
 REFERENCING NEW AS n
 FOR EACH ROW
 CALL write_audit( n.empno, 'Insert', 0.0, current user, current timestamp)

清单 10将演示如何对被插入到数据库的数据实施业务规则。本例将建立 empprojact表的业务规则。示例将引用emendate列并针对被插入到数据库中的数据执行几项业务规则。它还将把 SQLSTATE 的值 90000 赋给 Business Rule Two。这将允许您强行调用处理程序。使用SIGNAL语句允许您通过设置 SQLSTATE 强行显示错误或警告。

清单 10. 使用SQL PL 的BEFORE INSERT触发器

CREATE TRIGGER business_rules
BEFORE INSERT ON empprojact
REFERENCING NEW AS n
FOR EACH ROW
 BEGIN ATOMIC
 -- Business Rule One (Project ending date Can't be NULL)
 IF (n.emendate IS NULL) THEn
   SET n.emendate = CURRENT date;
 END IF;

 -- Business Rule Two (Project ending date Can't end in last month of the year)
 IF (n.emendate BETWEEN '2009-12-01' AND '2009-12-31') THEn
   SIGNAL SQLSTATE '90000'
    SET MESSAGE_TEXT = 'Business Rule violation - 90000';
 END IF;

 END!

结束语

本教程简要介绍了如何创建触发器,以及应用触发器处理各种业务规则和要求的方法、原因和时机,现在应当已经为您理解触发器奠定了坚实的基础,理解触发器是准备 IBM Certified Solution Developer - DB2 9.5 SQL Procedure Developer 认证考试(考试 735)的重要部分。

上一页  1 2 3 4 

Tags:DB SQL Procedure

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接