升級資料層應用程式

將部署的資料層應用程式 (DAC) 升級為新版本的程序,要比使用指令碼部署資料庫或資料庫變更來得簡單。資料庫開發人員只需要建置一個 DAC 封裝來描述新版本的結構描述和屬性。DAC 升級程序會比較新的結構描述與目前部署的結構描述,然後動態執行變更為新結構描述所需的動作。

升級程序

SQL Server 資料層應用程式升級程序會將部署的 DAC 轉換至相同應用程式的不同版本。例如,從 Finance 1.0 版升級到 Finance 2.0 版。下列步驟將說明簡單的部署程序:

  • 資料庫開發人員完成開發 Finance 1.0 版 DAC,然後建置 FinanceVersion1.dacpac DAC 封裝。

  • 資料庫管理員將 Finance 1.0 DAC 部署到實際執行環境。Database Engine 的實際執行個體現在具有部署的 DAC,此 DAC 具有應用程式名稱 Finance 1.0 版及名為 Finance 的關聯資料庫。

  • 然後資料庫開發人員開始開發下一版,開發完成時就會建置 FinanceVersion2.dacpac。

  • 資料庫管理員會計劃 DAC 升級程序。他們會備份 Finance 資料庫。他們會檢閱 DAC 封裝的內容以及升級將採取之動作的報表,以確認它們在實際執行資料庫中不會造成問題。

  • 然後資料庫管理員會執行 DAC 升級,同時指定目前部署的版本 1.0 DAC 和 2.0 版 DAC 封裝。執行升級有兩個選項:

    • 使用呼叫 DAC IncrementalUpgrade() 方法的 Windows PowerShell 指令碼,執行就地升級。就地升級會改變現有資料庫的結構描述,以符合新 DAC 版本中所定義的結構描述。

    • 使用 DAC Upgrade() 方法或 [升級資料層應用程式] 精靈,執行並存升級。並存升級會使用新的結構描述建立新的資料庫,並將原始資料庫中的資料傳送到新的資料庫。

  • 升級完成之後,已升級之 DAC 的應用程式名稱仍然為 Finance,而且相關聯的資料庫名稱仍然為 Finance,但是 DAC 版本現在是 2.0。

部署後變更資料庫

如果使用升級 DAC 以外的某個機制來變更資料庫,就表示資料庫從它的關聯 DAC 漂移。範例包括使用 CREATE TRIGGER 陳述式加入新的觸發程序,或使用 ALTER TABLE 陳述式來變更資料表的結構。根據指定的升級選項,某些類型的變更可能會讓 DAC 升級程序無法完成。這些變更也不會出現在升級的資料庫中。

DAC 升級作業會檢查在目前資料庫的結構描述以及儲存在 msdb 系統資料庫中的 DAC 定義之間的差異。如果它找到差異,就會發出警告對話方塊來列出差異。只有當您分析報告的差異並將其放置在處理序或指令碼中,以傳送此升級無法傳送但是新系統所需的任何物件或資料時,才應該繼續升級。

在升級完成之後,資料庫會包含新版 DAC 內所定義及新 DAC 中指定之表單內的所有物件。在大部分的情況下,這將會是與新版 DAC 和資料庫相關聯的應用程式版本所需的表單。分析升級變更報表時要特別小心,只能傳送新系統中所需的物件。例如,如果目前 DAC 中有幾個物件存在,而且新 DAC 中遺漏了資料庫,這可能不是錯誤。它們可能與使用 DAC 的新版應用程式中所卸除或重新設計的功能有關。

若是就地升級,則不會保留變更的物件。您必須儲存物件定義和資料,然後再開始升級。若是並存升級,則會在重新命名的原始資料庫中保留物件和資料。所有變更的物件都必須手動傳送到新的資料庫。

如需有關如何編寫要傳送至新資料庫之物件指令碼的詳細資訊,請參閱<如何:產生指令碼 (SQL Server Management Studio)>。

DAC 專案可以指定部署前和部署後的指令碼。這些是可以執行任何動作的 Transact-SQL 指令碼,包括在 DAC 中不支援建立物件。如果原始 DAC 包含的部署後指令碼建立了在 DAC 中不支援的物件,但是這些物件必須使用一個機制另外進行升級,這個機制可在就地升級期間卸除那些物件,或透過並存升級,保留在原始資料庫中。

就地升級

就地升級會執行下列動作:

  • 驗證部署的 DAC 和 DAC 封裝兩者都有相同的應用程式名稱 (例如,兩個名稱皆設為 Finance)。它也會評估 Database Engine 執行個體是否符合新版 DAC 中伺服器選取原則內所指定的需求 (如果有定義的話),以及現有的資料庫是否包含 DAC 中不支援的物件。

  • 執行讓資料庫執行個體符合新版 DAC 中定義之執行個體所需的所有修改,例如 CREATE、ALTER 和 DROP 陳述式。

如果 [忽略資料遺失] 選項設為 True,DAC 升級可能會執行移除資料的動作。例如,如果目前資料庫中的資料表存在,但不在新 DAC 的結構描述中,升級會卸除資料表。在執行作業之前,資料庫管理員必須封存升級後可能需要的所有資料。

SQL Azure 和 Database Engine 的執行個體都支援就地升級。就地升級需要使用 DAC Framework 1.1 以及新的 DAC 升級精靈 (包含在 SQL Server 2008 R2 Service Pack 1 (SP1) 中)。

並存升級

SQL Azure 以及下一個 SQL Server 版本都不支援並存升級。建議的升級機制是 SQL Server 2008 R2 SP1 所包含的就地升級。

並存升級會執行下列動作:

  • 驗證部署的 DAC 和 DAC 封裝兩者都有相同的應用程式名稱 (例如,兩個名稱皆設為 Finance)。它也會評估 Database Engine 執行個體是否符合新版 DAC 中伺服器選取原則內所指定的需求 (如果有定義的話),以及現有的資料庫是否包含 DAC 中不支援的物件。

  • 從 DAC 封裝部署新版的 DAC。這樣會使用暫時名稱建立新的資料庫。

  • 如果原始資料庫已經不在唯讀模式中,則會將它設定為唯讀,並將資料複製到新的資料庫。

  • 如果原始資料庫處於唯讀模式,新的資料庫會設定為唯讀。

  • 附加字串至資料庫名稱結尾來重新命名原始資料庫。

  • 新的資料庫會被指派原始的資料庫名稱。

  • 在資料庫管理員確認新的資料庫運作正常之後,就可以封存原始資料庫。

資料庫變更可能會影響資料表中的資料是否會傳送到新的資料庫。資料表可以處於與資料庫變更有關的以下狀態:

  • 資料表結構在所有的三個位置都一樣:msdb 中的目前 DAC 定義、目前的資料庫及新的 DAC。此資料表將會出現在新的資料庫中,而且升級作業會傳送資料到新的資料庫。傳送是根據舊資料表的 SELECT,使用 INSERT 陳述式來完成。

  • 資料表不存在於目前的 DAC 定義或資料庫中,但是會定義在新的 DAC 中。資料表將會出現在新的資料庫中,但沒有任何資料,因為目前沒有要傳送的資料。

  • 此資料表不存在於目前的 DAC 定義中,但確實存在於目前的資料庫和新的 DAC 中。此資料表將會出現在新的資料庫中,但是升級作業將不會傳送資料。在升級完成後,請以手動方式傳送資料。

  • 此資料表會存在於目前的 DAC 定義和資料庫中,但不存在於新的 DAC 中。此資料表將不會存在於新的資料庫中。如果新的系統需要此資料表,請以手動方式建立此資料表,並在升級完成後傳送資料。

  • 此資料表存在於三個位置中,但是目前 DAC 定義和資料庫中資料表的結構與新 DAC 中資料表的結構不同。此資料表將會出現在新的資料庫中,而且結構會定義在新的 DAC 中。

    • 如果資料表和資料行的名稱不符合,此升級作業將會報告它尚未傳送資料。在升級完成後,請以手動方式傳送資料。

    • 如果資料表名稱和資料行名稱相同,此升級作業將會嘗試傳送資料。如果有一個或多個資料行的資料類型已變更而且不相容,INSERT 陳述式將會失敗,這將會導致升級程序回復。

您可以使用任何機制,將資料傳送至新版的資料表。您可以使用從舊版的資料表中選取的 INSERT 陳述式。您也可以使用匯入和匯出大量資料中所討論的其中一個大量插入技術。

變更記錄

更新的內容

已描述 DAC Framework 1.1 所導入的就地升級。已移除其他主題中重複的內容。

SQL Server 2008 R2 SP1 對就地升級提供完整支援,包含 DAC Framework 1.1 及新的升級精靈兩者。