升級到國際化的數據庫之升級表至unicode(一)

建立支持國際化的數據庫成爲每個跨國公司及拓展海外業務的公司來說很有意義。
而如何將現在的數據庫升級到國際化的數據庫成爲了一件很實際的問題。
下面我們來談談如何對SQLSERVER2005下表的升級。
(有關升級到unicode,對目前DB的影響,請見我的另一篇文章:升級到unicode產生的影響面)
不同DB的分析:
1. 存在分區表或分區索引 (公司這樣的情況是否存在,這次是否需要研究這方面的升級?)
    分區列所在的表將不進行升級。因升級後的列與原來的分區架構(分區函數)中的分區列的類型不同,從而不能再重立起原有的分區表或分區索引。
    若也要升級分區列所在的表,則:(據需要會進一步研究)
分區函數中的分區列,需升級至unicode,但這樣那些未升級至unicode的分區列所在的表,將無法使用原分區架構與分區函數。所以:
      a.升級所有分區列所在的表,同時升級對應的分區架構與分區函數。
      b.升級部分分區列所在的表,爲了不影響未升級的分區表或分區索引所在的表,
        則不刪除仍在使用中的原分區架構與分區函數,而另外再建立新的分區架構與分區函數(分區列改爲unicode類型)
2. 無複製分發的情況
直接升級表(除了分區列(分區表及分區索引)所在的表不能升級)
3. 存在複製分發的情況
  (1) 若在不去除複製分發的情況下,用於複製分發的表及與這些表有關聯的表(如外健引用)都將不會被升級。
  (2)若要對用於複製分發的表,也進行升級,則必須先刪除掉複製分發後再升級
   a.生成原複製分發項目的腳本
   b.刪除複製分發項目
   c.升級表(至unicode)
   d.重建複製分發(用生成的腳本重新生成原複製分發項目,更改密碼及重新生成snapshot即可)
      生成的原複製分發項目的腳本與列的類型無關,即只與表及分發哪些列的名稱有關,所以在修改列的類型 後,仍可用生成的原複製分發項目的腳本(含分佈與訂閱),重建複製分發。
 
可以升級的表的處理方案大體有兩種方案:
方案1:外鍵不及時建立 ----適用停機升級 
      (缺點是與複製分發及分區列上的與升級後的表上引用即外健會無法建立,
        但這會記錄下來,以便手工處理,以後會進一步完善)
WHILE依次傳入每個要升級的表-----外層
        具體處理一個表 -----內層,作爲一個事務執行
        1. 記錄下每個要升級列上的所有對象
          (PK,UQ,INDEX,DEFAULT,CHECK,外健及被引用表上的外健)
        2. 刪除一個表上與升級列有關的所有對象,及引用表上的外健
        3. 更新一個表的所有列至unicode
        4. 重新建立本表上與升級列有關的所有對象,除了外健(引用和被引用)。
            因本表列升級後,與之關聯的表沒有升級對應的列,此時無法再建立起本表上的外健,
         及引用表上的外健(引用和被引用)
       5. 若事務執行失敗,則回滾,同時將表名,更改列的SQL,刪除對象的SQL,
             重新生成所有對象的SQL,及外健都記錄表執行失敗的表中,以供分析。
所有表升級後,統一建立每個表上的外鍵。-----外層
若無法建立,則將建立外健的SQL記錄到‘外健建立失敗的表中’,以供分析與處理-----外層
(此時主,外表都升級了,所以外健可以建立上)當然也存在引用表上的外健無法建立的情況(即從表升級了,但主表未升級,這會記錄下來)。
方案2:外鍵及時建立,這樣外健約束會及時生效  ---適用聯機升級(不推)
            遞歸處理與本表相關聯的表,要是關聯的表太多,開銷會很大。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章