数据库资讯

DB2 Version 9.5 pureXML的增强和新特性

注册之后,可以用以下存储过程将现有模式更新为新模式:

清单7. 使用 XSR_UPDATE 更新模式

db2 call XSR_UPDATE('RSCHEMA','CUSTOMER','RSCHEMA','CUSTOMER1',0)

最后一个参数值0表示更新之后不应该删除新模式。如果该参数设置为其他非零值,在更新操作之后新模式将会被删除。

示例代码xsupdate.db2演示了兼容的XML模式演化。可以在sqllib/samples/xml/clp目录中找到该示例。

验证触发器支持

为了提高应用程序灵活性并为用户提供对引入的XML文档的自动验证功能,DB2 V9.5扩展了在beforetrigger中对XML的支持。beforetrigger是使用BEFORE选项创建的触发器,并在 inster/update/delete操作之前执行。在beforetrigger中,可以在新变量中引用XML值。触发器的操作可以对新值应用 xmlvalidate函数。触发器的WHEN子句可以用来检查是否根据任何指定模式对新值进行了验证。可以使用WHEN条件中的ISVALIDATED 或ISNOTVALIDATEDACCORDINGTOXMLSCHEMA子句来完成该操作。根据WHEN条件的输出,可能还需要验证XML值或设置一个 新值。目前,只允许将xmlvalidate函数用于XML类型的transition变量。触发器创建之后,在每次执行插入操作时,将会被自动激活并执 行,如果在插入语句中没有验证XML值,也可以用触发器进行验证。

以下代码是一个DDL语句,用于创建customer表和根据该表定义的触发器。只要存在对表的插入操作,就会激活触发器。如果没有在插入语句中对 XML文档进行验证,触发器将会在插入之前使用xmlvalidate函数验证该文档。以下的示例代码假设表的customer不存在,并且已经在数据库 中注册了该customer模式。

清单8.为一个表定义的触发器

CREATE TABLE Customer ( Cid        BIGINT NOT NULL,
info       XML,
History    XML,
CONSTRAINT PK_CUSTOMER PRIMARY KEY (Cid))
CREATE TRIGGER Trigger_customer NO CASCADE BEFORE INSERT ON customer
REFERENCING NEW AS n
FOR EACH ROW MODE db2sql
WHEN (n.info IS NOT VALIDATED ACCORDING TO XMLSCHEMA ID customer)
BEGIN ATOMIC
SET n.info = XMLVALIDATE(n.info ACCORDING TO XMLSCHEMA ID customer);
END@

示例 xmltrig.db2 提供了不同的场景和操作,这些操作用来分配新值并验证 XML 值,可以在触发器内部执行。该示例可以在 sqllib/samples/xml/clp 目录中找到。

XML 验证检查约束

检查约束(check constraint)是一类可以在创建表时作用到表列的约束。只有当约束合法时,DB2 才允许插入操作,否则插入将会失败。

DB2 V9.5 支持对 XML 值进行检查约束。用户可以使用检查约束来加强对 XML 列的验证。与 before trigger 类似,可以在检查约束中使用 IS VALIDATED ACCORDING TO XMLSCHEMA 子句来加强验证。惟一的区别在于,这种约束只检查验证条件,并不会进行实际的验证。用户可以在插入语句中使用 xmlvalidate 来显式验证 XML 值,或者使用 before trigger 来执行自动验证。根据检查约束中指定的模式,只有当 XML 值有效时,才能成功插入。

对一个表 XML 值应用 before trigger 和检查约束,往往可以确保 XML 值对于指定模式是有效的。只要执行了插入操作,before trigger 就会自动进行验证,而检查约束将会让用户显式地使用 xmlvalidate 函数。这两种方法可以一起使用,以加强 XML 值的完整性。

清单9 中的代码将会修改 清单 8 中创建的表 customer,以对表执行检查约束:

清单9. 检查约束

db2 ALTER TABLE customer ADD CONSTRAINT check_info

CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer)

上面创建的检查约束总是会检查是否根据 customer 模式对文档进行了验证。如果没有触发器,用户需要使用 xmlvalidate 函数显式地验证该文档。

示例代码 xmlcheckconstraint.db2 演示了如何为具有相同结构的不同表创建视图,该视图可以进行检查约束,以及按模式对表进行划分。

XML 复制支持

DB2 V9.5 支持将 XML 数据复制到其他支持 XML 数据的数据库。可以使用 WebSphere® Replication Server 9.5 版或者 WebSphere Data Event Publisher 9.5 版来进行复制。WebSphere Replication Server 可以将 XML 数据复制到支持 XML 数据类型的联合目标,也可以将 XML 数据映射到 CLOB/BLOB 列。

像任何其他关系列一样,对 XML 数据的复制是在事务消息中完成的,因此复制的 XML 的大小将受到最大事务消息长度的限制。如果数据很大,可以在原始文档中插入一个占位符文档。也可以在例外表中插入一个例外。

当进行复制时,不能对 XML 模式注册进行复制。此外,在复制过程中也不能对 XML 数据进行验证。

XML 联合支持

WebSphere Federation Server Version 9.1 支持 pureXML,因此能够集成本地和远程的 XML 存储数据。可以将来自不同数据库的 XML 数据当作本地数据查看,而且可以用 DB2 XQuery 和 SQL/XML 查询这些数据。可以在远程联合数据库上创建一个视图,以连续字符串的方式查看该数据,这些数据可以在 WebSphere Federation Server 上解析为 XML 值。现在 DB2 可以使用 SQL/XML 和 XQuery 语言通过为视图创建的别名来查询数据。

与验证本地 XML 值的方式相同,可以使用 db2 xmlvalidate 函数验证来自不同联合数据源的 XML 数据。

希望看到您的想法,请您发表评论x