技术开发 频道

DB2 Version 9.5 pureXML的增强和新特性

使用 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 扩展了在 before trigger 中对 XML 的支持。 before trigger 是使用 BEFORE 选项创建的触发器,并在 inster/update/delete 操作之前执行。在 before trigger 中,可以在新变量中引用 XML 值。触发器的操作可以对新值应用 xmlvalidate 函数。触发器的 WHEN 子句可以用来检查是否根据任何指定模式对新值进行了验证。可以使用 WHEN 条件中的 IS VALIDATED 或 IS NOT VALIDATED ACCORDING TO XMLSCHEMA 子句来完成该操作。根据 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 目录中找到该示例。

XSLT 支持

DB2 V9.5 提供了使用数据库本身的 XSL 转换来处理 XML 文档的功能。可以使用 XSLT 样式表将存储在数据库中的 XML 文档转换为 HTML 格式。为此,DB2 V9.5 引入了 xsltransform 函数。该函数还支持使用参数的样式表。xsltransform 函数可以将作为 XML 文档存储在数据库表列中的 XSLT 样式表应用到 XML 文档上。这为用户提供了灵活性,用户可以检索来自数据库的经过转换的 XML 文档,并可以直接在 Web 上显示。

现在,假设您已有下面的 XML 文档:

 清单10. XML 文档

Ice Scraper, Windshield 4 inch

Basic Ice Scraper 4 inches wide, foam handle

3.99

0
相关文章