使用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 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 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 目录中找到该示例。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
数据库产品巡礼:IBM DB2概览
IBM DB2关系型数据库管理系统提供了支持多平台系统的关键技术,它具备较高的可用性和良好的性能。
-
如何进行分布式大数据应用调优
分布式环境通常是与数据库服务器相分离的。而DBA的工作就是监视这些环境并配置和优化数据库服务器以满足多种需求。大数据的出现加剧了DBA的问题。
-
IBM DB2将迎来30岁“生日”
再过几天,主流数据库产品DB2就将迎来它30岁的“生日”。作为关系型数据库技术的标志性产品,DB2在过去的30年中也在伴随用户需求的变化不断地发展。
-
SQL调优之“忧”:如何进行SQL调优
DBA们应该将自己从“我要对什么调优?”的老路上解放出来,而在指标、配置和成本方面花费一定的时间。