首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 中 XML Schema 管理實戰(二):Schema 演進與 XML 數據遷移策略

     編輯:DB2 教學

XML Schema 演進三大典型場景

  1. 向上兼容更新:新 Schema 與現有兼容,現有 XML 數據無需修改即符合新 Schema
  2. 不兼容更新 + 數據轉換:新 Schema 不兼容,現有 XML 數據需轉換適配
  3. 不兼容更新 + 多版本共存:新 Schema 不兼容,舊 Schema 繼續管理舊數據,無需轉換

場景一:向上兼容更新

初始 Schema 與數據

cust1.xsd 定義 customer 元素包含 name、address、phone、email。數據 cust1.xml 遵循此 Schema。註冊並導入表 T1:

REGISTER XMLSCHEMA 'cust1.xsd' FROM '/work/cust1.xsd' AS SAMPLE2.CUST1;
COMPLETE XMLSCHEMA SAMPLE2.CUST1;
CREATE TABLE T1 (ID INT NOT NULL PRIMARY KEY, XMLDATA XML NOT NULL);
IMPORT FROM /work/cust1.del OF DEL XML FROM /work XMLVALIDATE USING SCHEMA SAMPLE2.CUST1 INSERT INTO T1;

查詢驗證信息顯示 OBJECTID、關系 ID SAMPLE2.CUST1、Schema 位置 cust1.xsd。

兼容性擴展:添加可選 cell-phone 元素

cust2.xsd 在 phone 後添加 <xs:element name="cell-phone" minOccurs="0" type="xs:string"/>。註冊後用 UPDATE XMLSCHEMA 替換:

UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2;

新數據 cust2.xml 包含 cell-phone,用舊關系 ID SAMPLE2.CUST1 驗證導入成功。查詢顯示兩條記錄 OBJECTID 不變,Schema 位置更新為 cust2.xsd。舊數據自動符合新 Schema。

關鍵注意點

  • 更新後需 DROP NEW SCHEMA 避免 Schema 位置衝突:UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2 DROP NEW SCHEMA;
  • 或註冊新 Schema 時指定舊 Schema 位置:REGISTER XMLSCHEMA 'cust1.xsd' FROM '/work/cust2.xsd' AS SAMPLE2.CUST2;
  • 向上兼容要求新增元素/屬性必須可選,無法強制驗證必填

場景二:不兼容更新與數據轉換

新 Schema 結構變更

cust3.xsd 將 phone 重構為複雜類型 phoneType,包含必填 home、cell 子元素。註冊導入新數據 cust3.xml。

舊數據轉換邏輯

ID 1、2、22 的舊數據需轉換:

  • 在 /customer/phone 下添加 home、cell 元素
  • 原 phone 值移至 /customer/phone/home
  • 若存在 cell-phone 移至 /customer/phone/cell 並刪除 cell-phone
  • 更新 xsi:noNamespaceSchemaLocation 為 cust3.xsd

SQL 實現數據遷移

UPDATE T1
SET XMLDATA = XMLVALIDATE(XMLQUERY(
  'declare namespace xsi="https://www.w3.org/2001/XMLSchema-instance";
  copy $new := $XMLDATA
  modify (
    do replace $new/customer/phone with
      <phone>
        <home>{$new/customer/phone/text()}</home>
        <cell>{$new/customer/cell-phone/text()}</cell>
      </phone>,
    do replace value of $new/customer/@xsi:noNamespaceSchemaLocation with "cust3.xsd",
    do delete $new/customer/cell-phone
  )
  return $new'))
WHERE XMLXSROBJECTID(XMLDATA) = (SELECT OBJECTID FROM SYSCAT.XSROBJECTS
  WHERE OBJECTSCHEMA='SAMPLE2' AND OBJECTNAME='CUST1');

使用 XMLQUERY 複製修改返回新文檔,XMLVALIDATE 按新 Schema 位置驗證,WHERE 子句精確定位舊 Schema 驗證的記錄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved