您所在的位置:数据库 > DB2 > DB2 Version 9.5 pureXML的增强和新特性(2)

DB2 Version 9.5 pureXML的增强和新特性(2)

2009-03-10 10:31 佚名 ITPUB 字号:T | T
一键收藏,随时查看,分享好友!

本文描述 IBM® DB2® V9.5 版针对 Linux、Unix 和 Windows 的 pureXML™ 增强和新特性。DB2 Version 9 支持将 XML 作为原生数据类型,也支持 SQL/XML、XQuery 语言,以及其他诸如模式支持、发布函数、对实用工具的 XML 支持、分解等特性。DB2 V9.5 增强了其中的一些特性并引入了新特性,以更加高效地处理 XML。本文从如何使 XML 处理更高效和更易于使用的角度解释了这些增强和新特性。

AD:

使用 XML 数据基础表行存储的理想情形是,当表只有一个 XML 类型列并且 XML 文档的最大值没有超过页面大小时。

兼容的 XML 模式演化

为了增加灵活性并提供更好的模式演化,DB2 V9.5 为 XML 模式引入了 update 特性。以前注册的模式能够更新为新模式,只要它们互相兼容。如果使用旧模式验证的 XML 文档对于新模式仍然有效,那么这两种模式就是兼容的。

例如,新模式中添加的可选元素和旧模式中的元素兼容,这是由于新元素的可选特性使经过旧模式验证的 XML 文档仍然有效。新 XML 文档可以拥有这个可选元素,并且能够通过新模式的验证。因为旧文档仍然有效,所以更新模式之后无需再执行任何操作。如果模式不兼容,模式更新就会失败。旧模式的注释和标识符仍然会保留。

为了更新模式,DB2 V9.5 引入了 XSR_UPDATE 存储过程。存储过程检查兼容性,只当新模式具备兼容性时才更新模式。要更新模式,用户需要分别注册新旧模式,然后调用 XSR_UPDATE 存储过程。一旦旧模式经过更新,用户可以选择保留旧模式或者将其删除。

让我们以 customer 表的 info 列作为一个例子。info 列包含 addr 元素,该元素具有以下定义(在 sqllib/samples/db2sampl 目录下可以找到完整的模式)。

清单 5. 旧 XML 模式定义

﹤xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="addr" minOccurs="1" maxOccurs="unbounded"﹥
﹤xs:complexType﹥
﹤xs:sequence﹥
﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥
﹤/xs:sequence﹥
﹤xs:attribute name="country" type="xs:string" /﹥
﹤/xs:complexType﹥
﹤/xs:element﹥

之后,用户希望拥有一个可选的 HouseNo 元素。要更新已注册的模式以使标识符保持不变,需要先注册包含附加元素的新模式。 新 addr 元素的定义如下:

清单 6. 新 XML 模式定义

﹤xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="addr" minOccurs="1" maxOccurs="unbounded"﹥
﹤xs:complexType﹥
﹤xs:sequence﹥
﹤xs:element name="HouseNo" type="xs:string" minOccurs="0" /﹥
﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥
﹤/xs:sequence﹥
﹤xs:attribute name="country" type="xs:string" /﹥
﹤/xs:complexType﹥
﹤/xs:element﹥

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

清单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 数据。

载入支持

DB2 9 主要支持两种用 XML 值填充表的方式。insert 语句向表中插入 XML 值,import 实用程序用于将大量数据导入表中。

DB2 V9.5 扩展了对 load 实用程序的支持。load 支持 import 支持的大多数 XML 数据选项。可以使用 FROM 子句为 XML 数据指定路径。在 load 期间可以使用 XMLVALIDATE USING 子句对 XML 数据进行验证。load 有 3 个不同的选项:XDS、SCHEMA 和 SCHEMALOCATION HINTS。当指定 XDS 选项时,可以使用 DEFAULT, IGNORE 和 MAP 子句。这些选项的含义与 import 中对应选项的含义相同。可以使用文件类型修改器 XMLCHAR 和 XMLGRAPHIC 指定数据的代码页。XML 数据指定程序(XML data specifier,XDS)在数据文件中指定 XML 值。load 重启的行为和原来一样。它通过扫描所有 XML 文档重新构建所有索引。

示例代码 xmlload.db2 演示了 DB2 V9.5 中可用的 XML 数据载入选项。可以在 sqllib/samples/xml/clp 目录中找到该示例。

内容导航



分享到:

  1. 因为没有网关,我的服务器被DDoS了
  2. MySQL:第一次看到有人把MySQL主从复制讲解的这么清楚

热点职位

更多>>

热点专题

更多>>

读书

Linux环境下C编程指南
本书系统地介绍了在Linux平台下用C语言进行程序开发的过程,通过列举大量的程序实例,使读者很快掌握在Linux平台下进行C程序开发

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院