如何:升級資料層應用程式

可以使用 [升級資料層應用程式] 精靈或 Windows PowerShell 指令碼,將目前部署之資料層應用程式 (DAC) 的結構描述和屬性變更為符合新版 DAC 中定義的結構描述和屬性。

就地升級與並存升級

升級有以下兩種類型:

  • 並存升級會保留現有資料庫的複本,同時建置新的資料庫,此資料庫擁有新版 DAC 中所定義的結構描述。接著,它會將資料從舊的資料庫複製到新的資料庫中。

  • 就地升級會改變現有資料庫的結構描述,以符合新 DAC 版本中所定義的結構描述。

SQL Server 2008 R2 和 Microsoft Visual Studio 2010 內含的 DAC Framework 1.0 僅支援並存升級。並存升級不支援 SQL Azure。SQL Server 2008 R2 Service Pack 1 (SP1) 和 Visual Studio 2010 SP1 都包含新的 DAC Framework 1.1,這個元件會針對 SQL Azure 和 Database Engine 的執行個體導入就地升級。如需有關 DAC Framework 1.1 的詳細資訊,請參閱<SQL Server 物件和版本的 DAC 支援

DAC 升級精靈的原始版本使用 DAC Framework 1.0 執行並存升級。SQL Server 2008 R2 SP1 中的精靈版本則執行就地升級。

SQL Server 2008 R2 使用者可以透過安裝 SQL Server 2008 R2 SP1 升級為新的精靈以及 DAC Framework 1.1。

準備升級

您必須在開始升級之前,進行資料庫的完整備份。如果升級時發生錯誤而無法回復其所有升級,您可能需要還原備份。

驗證 DAC 封裝以及升級動作時,有幾個您應該採取的動作。如需有關如何執行這些檢查的詳細資訊,請參閱<如何:驗證 DAC 封裝>。

  • 建議您不要使用來源不明或來源不受信任的 DAC 封裝來升級。這類 DAC 可能包含惡意程式碼,因此可能會執行非預期的 Transact-SQL 程式碼,或是修改結構描述而造成錯誤。在您使用來源不明或來源不受信任的 DAC 之前,請解除封裝 DAC 並檢查程式碼,例如預存程序或其他使用者定義的程式碼。

  • 如果您在部署原始 DAC 之後對目前的資料庫做了變更,某些變更可能會使升級無法成功完成,或因為升級而遭到移除。您應該先產生一個檢閱,這個檢閱中包含對資料庫所做之任何此類變更的報表。

  • 您必須產生一個更新將執行之結構描述變更的清單,並檢閱其中是否有任何問題。

選擇 DAC 升級選項

就地升級有四個升級選項:

忽略資料遺失 – 若為 True,即使某些作業導致資料遺失,升級還是會繼續。若為 False,這些作業將會結束升級。例如,如果目前資料庫中的資料表不在新 DAC 的結構描述中,指定 True 時,將會卸除資料表。預設值是 True。

變更時封鎖 - 若為 True,當資料庫結構描述不同於舊版 DAC 中所定義的資料庫結構描述時,就會結束升級。若為 False,即使偵測到變更,升級仍會繼續。預設值是 False。

失敗時回覆 - 若為 True,升級將會包含在交易中;如果發生錯誤,將會嘗試回復。若為 False,將會認可所有變更;如果發生錯誤,您可能必須還原資料庫的先前備份。預設值是 False。

略過原則驗證 - 若為 True,則 DAC 伺服器選取原則不會經過評估。若為 False,原則會經過評估;如果有驗證錯誤,則升級將會結束。預設值是 False。

需求

DAC 只能由系統管理員 (sysadmin) 或伺服器管理員 (serveradmin) 固定伺服器角色的成員,或是具有 dbcreator 固定伺服器角色及擁有 ALTER ANY LOGIN 權限的登入升級。登入必須是現有資料庫的擁有者。內建的 SQL Server 系統管理員帳戶 (名稱為 sa) 也可以啟動精靈。

DAC 封裝中的應用程式名稱必須符合目前部署之 DAC 的應用程式名稱。例如,如果目前的 DAC 具有應用程式名稱 GeneralLedger,您只能使用同樣具有應用程式名稱 GeneralLedger 的 DAC 封裝來升級。

登入密碼

為了提高安全性,SQL Server 驗證登入會儲存在 DAC 封裝中,而且沒有任何密碼。當您部署或升級此封裝時,此登入會建立為停用的登入,而且會產生密碼。若要啟用登入,請使用具有 ALTER ANY LOGIN 權限的登入進行登入,並使用 ALTER LOGIN 來啟用登入,然後指派可以傳達給使用者的新密碼。Windows 驗證登入不需要這項處理,因為這類登入的密碼不是由 SQL Server 所管理。

空間考量因素

針對就地升級,主要空間考量是要有足夠的交易記錄空間可以記錄所有修改。

並存升級會針對部署的 DAC 保留目前的資料庫,也會建立新的資料庫,並將現有的資料複製至新的資料庫。您應該擁有足夠的可用磁碟空間來存放與現有資料庫一樣大的新資料庫。在執行並存升級之前,請確定目前資料庫中的資料量不會因為太大而無法放入新資料庫中。升級所建立的資料庫將會擁有 CREATE DATABASE 陳述式中的預設大小設定。預設值是一個資料檔具有初始大小 3 MB 及數目不限的 1 MB 增量,一個記錄檔具有初始大小 1 MB 及大小上限 2 GB。

並存資料庫選項

在並存升級中,部署階段期間建立的資料庫將會擁有 CREATE DATABASE 陳述式中的所有預設設定,但是以下項目除外:

  • 資料庫定序和相容性層級設定為 DAC 封裝內所定義的值。在 Visual Studio 中從 DAC 專案建置的封裝會使用 DAC 專案中的設定值。從現有的資料庫中擷取的封裝會使用原始資料庫中的值。

  • 您可以在 [更新組態] 頁面上調整某些資料庫設定,例如資料庫名稱和檔案路徑。

某些資料庫選項 (例如 TRUSTWORTHY、DB_CHAINING 和 HONOR_BROKER_PRIORITY) 無法在部署過程中調整。實體屬性 (如檔案群組數目或檔案數目和大小) 無法在部署過程中更改。部署完成之後,您可以使用 ALTER DATABASE 陳述式、SQL Server Management Studio 或 SQL Server PowerShell 來修改資料庫。如需詳細資訊,請參閱<修改資料庫>。

使用 PowerShell 進行 DAC 就地升級

此範例使用 DAC Framework 1.1 IncrementalUpgrade() 方法執行 DAC 就地升級。此方法將會升級 SQL Server 或 SQL Azure 上的 DAC。取得新 Framework 的建議方式是安裝 SQL Server 2008 R2 SP1。

建立包含下列程式碼的 PowerShell 指令碼 (例如 IncrementalUpgradeDAC.ps1) 檔案。

  1. 加入程式碼以建立 SMO Server 物件並將它設定為包含您想要從中擷取 DAC 之資料庫的執行個體。此範例會將 Server 物件設定為本機電腦上的預設執行個體:

    ## Set a SMO Server object to the default instance on the local computer.
    CD SQLSERVER:\SQL\localhost\DEFAULT
    $srv = get-item .
    
  2. 加入程式碼以開啟 ServerConnection 物件並連接至相同的執行個體。

    ## Open a Common.ServerConnection to the same instance.
    $serverconnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($srv.ConnectionContext.SqlConnectionObject)
    $serverconnection.Connect()
    $dacstore = New-Object Microsoft.SqlServer.Management.Dac.DacStore($serverconnection)
    
  3. 加入程式碼以載入 DAC 封裝檔案。此範例會載入 MyApplicationVNext.dacpac 檔案。

    ## Load the DAC package file.
    $dacpacPath = "C:\MyDACs\MyApplicationVNext.dacpac"
    $fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)
    $dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)
    
  4. 加入程式碼以訂閱 DAC 部署事件。

    ## Subscribe to the DAC deployment events.
    $dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
    $dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})
    
  5. 加入程式碼以指定要升級的 DAC 以及升級選項、升級 DAC,然後關閉 DAC 封裝檔案:

    ## Upgrade the DAC and create the database.
    $dacName  = "MyApplication"
    ## Set the upgrade options.
    $upgradeProperties = New-Object Microsoft.SqlServer.Management.Dac.DacUpgradeOptions
    $upgradeProperties.blockonchanges = $true
    $upgradeProperties.ignoredataloss = $false 
    $upgradeproperties.rollbackonfailure = $true
    $upgradeProperties.skippolicyvalidation = $false
    ## Do not set IgnoreDrift, replaced by BlockOnChanges.
    
    ## Upgrade the DAC and create the database.
    $dacstore.IncrementalUpgrade($dacName, $dacType, $upgradeProperties)
    
    $fileStream.Close()
    

從您已載入 SQL Server PowerShell 嵌入式管理單元的 PowerShell 工作階段,或使用 sqlps 命令提示字元公用程式執行 IncrementalUgradeDAC.ps1。

使用精靈進行 DAC 就地升級

在 Management Studio 中,您可以啟動升級資料層應用程式精靈,其方式是在 [物件總管] 中開啟伺服器節點,並選取 [管理] 節點,然後選取 [資料層應用程式] 節點。以滑鼠右鍵按一下 [物件總管] 中的資料層應用程式節點,然後選取 [升級資料層應用程式]

警告注意事項注意

SQL Server 2008 R2 原始版本中 DAC 升級精靈所執行的並存升級在 SQL Azure 中不受到支援。本節說明如何使用 SQL Server 2008 R2 SP1 中的新版精靈,以便執行就地升級。

按一下以下清單中的連結可導覽到精靈中頁面的詳細資料:

  • 簡介頁面

  • 選取封裝頁面

  • 檢閱原則頁面

  • 偵測變更頁面

  • 檢閱升級計畫

  • 摘要頁面

  • 升級 DAC 頁面

簡介頁面

此頁面描述升級資料層應用程式的步驟。

不要再顯示此頁面。- 按一下此核取方塊,之後就不會再顯示此頁面。

下一步 > - 繼續前往 [選取封裝] 頁面。

取消 - 結束精靈,而不升級 DAC。

選取封裝頁面

使用此頁面來指定包含新版資料層應用程式的 DAC 封裝。此頁面會在兩種狀態之間轉換。

選取 DAC 封裝

使用此頁面的初始狀態來選擇要部署的 DAC 封裝。DAC 封裝必須是有效的 DAC 封裝檔案,而且必須有 .dacpac 副檔名。DAC 封裝中的 DAC 應用程式名稱必須與目前 DAC 的應用程式名稱相同。

DAC 封裝 - 指定包含新版資料層應用程式之 DAC 封裝的路徑和檔案名稱。您可以選取方塊右邊的 [瀏覽] 按鈕,瀏覽到 DAC 封裝的位置。

應用程式名稱 - 當撰寫 DAC 或是從資料庫擷取 DAC 時,顯示指派之 DAC 應用程式名稱的唯讀方塊。

版本 - 當撰寫 DAC 或是從資料庫擷取 DAC 時,顯示指派之版本的唯讀方塊。

描述 - 當撰寫 DAC 或是從資料庫擷取 DAC 時,顯示撰寫之描述的唯讀方塊。

< 上一步 - 返回 [簡介] 頁面。

下一步 > - 將進度列顯示為確認選定檔案為有效 DAC 封裝的精靈。

取消 - 結束精靈,而不升級 DAC。

驗證 DAC 封裝

將進度列顯示為確認選定檔案為有效 DAC 封裝的精靈。如果 DAC 封裝已經驗證,此精靈會繼續前往 [檢閱原則] 頁面。如果檔案不是有效的 DAC 封裝,精靈會停留在 [選取 DAC 封裝] 上。請選取另一個有效的 DAC 封裝,或是取消精靈並產生新的 DAC 封裝。

正在驗證 DAC 的內容 - 報告驗證程序之目前狀態的進度列。

< 上一步 - 回到 [選取封裝] 頁面的初始狀態。

下一步 > - 繼續前往最後一版的 [選取封裝] 頁面。

取消 - 結束精靈,不部署 DAC。

檢閱原則頁面

使用此頁面來檢閱評估 DAC 伺服器選取原則的結果 (如果 DAC 有原則的話)。DAC 伺服器選取原則為選擇性,而且當它在 Microsoft Visual Studio 中撰寫時會指派給 DAC。此原則會使用伺服器選取原則 Facet 來指定 Database Engine 執行個體主控 DAC 所應該符合的條件。

原則條件的評估結果 - 唯讀報表,顯示 DAC 伺服器選取原則中的條件評估是否成功。評估每個條件的結果會在個別行上報告。

忽略違反原則 - 使用這個核取方塊可在一個或多個原則條件失敗時繼續升級。只有當您確定所有失敗的條件都不會阻礙 DAC 作業的成功時,才選取此選項。

< 上一步 - 返回 [選取封裝] 頁面。

下一步 > - 繼續進行 [偵測變更] 頁面。

取消 - 結束精靈,而不升級 DAC。

偵測變更頁面

使用此頁面可報告此精靈檢查資料庫變更的結果,此結果會讓它的結構描述與 msdb 中 DAC 中繼資料內儲存的結構描述定義不同。例如,如果一開始部署 DAC 之後,已經使用 CREATE、ALTER 或 DROP 陳述式來從資料庫中加入、變更或移除物件。此頁面會先顯示進度列,然後報告分析的結果。

正在偵測變更。這可能需要幾分鐘時間 - 當精靈檢查目前的資料庫結構描述與 DAC 定義中的物件之間是否有差異時,將會顯示一個進度列。

變更偵測結果 - 指示分析已完成,而且在底下報告結果。

資料庫 DatabaseName 尚未變更 - 此精靈在資料庫內定義的物件與其在 DAC 定義內的對應物件之間並未偵測到任何差異。

資料庫 DatabaseName 已變更 - 此精靈在資料庫內的物件與其在 DAC 定義內的對應物件之間偵測到變更。

儘管變更可能遺失,還是繼續進行 - 指定您了解目前資料庫中的某些物件或資料將不會出現在新的資料庫中,但是您仍然願意繼續升級。只有當您已經分析變更報告,並了解手動傳送新資料庫中所需之任何物件或資料所必須執行的步驟時,才應該選取這個按鈕。如果您不確定,請按一下 [儲存報表] 按鈕儲存變更報表,然後按一下 [取消]。分析報表、規劃如何在升級完成之後傳送任何必要的物件和資料,然後重新啟動精靈。如需詳細資訊,請參閱<升級資料層應用程式>。

儲存報表 - 按一下此按鈕,可儲存精靈在資料庫內的物件與其在 DAC 定義內的對應物件之間偵測到之變更的報表。然後您可以檢閱報表,以決定升級完成之後是否需要採取動作,將報表中列出的某些物件或所有物件併入新的資料庫內。

< 上一步 - 返回 [選取 DAC 封裝] 頁面。

下一步 > - 繼續進行 [檢閱升級計畫] 頁面。

取消 - 結束精靈,不部署 DAC。

檢閱升級計畫頁面

您可以使用此頁面來檢閱升級程序所採取的動作。只有當您確定升級不會產生問題時,才應該繼續進行。

將使用以下動作升級 DAC - 檢閱顯示的資訊,以確保採取的動作將會是正確的。[動作] 欄會顯示針對升級所執行的動作,例如 Transact-SQL 陳述式。如果相關聯的動作可能會刪除資料,[資料遺失] 欄就會包含警告。

重新整理 - 重新整理動作清單。

儲存動作報表 - 將動作視窗的內容儲存至 HTML 檔。

儘管變更可能遺失,還是繼續進行 - 指定您了解目前資料庫中的某些物件或資料將不會出現在新的資料庫中,但是您仍然願意繼續升級。只有當您已經分析變更報告,並了解手動傳送新資料庫中所需之任何物件或資料所必須執行的步驟時,才應該選取這個按鈕。如果您不確定,請按一下 [儲存動作報表] 按鈕儲存變更報表並按一下 [儲存指令碼] 按鈕儲存 Transact-SQL 指令碼,然後按一下 [取消]。分析報表和指令碼、規劃如何在升級完成之後傳送任何必要的物件和資料,然後重新啟動精靈。如需詳細資訊,請參閱<升級資料層應用程式>。

儲存指令碼 - 將用來執行升級的 Transact-SQL 陳述式儲存至文字檔。

還原預設值 - 將此選項還原為預設設定 false。

< 上一步 - 返回 [偵測變更] 頁面。

下一步 > - 繼續進行 [摘要] 頁面。

取消 - 結束精靈,不部署 DAC。

摘要頁面

使用此頁面來檢閱升級 DAC 時,精靈將會採取的動作。

將使用以下設定升級您的 DAC - 檢閱顯示的資訊,以確保採取的動作將會是正確的。此視窗會顯示您選取要進行升級的 DAC,以及包含新版 DAC 的 DAC 封裝。此視窗也會顯示目前的資料庫版本是否與目前的 DAC 定義相同,或資料庫是否已經變更。

< 上一步 - 返回 [偵測變更] 頁面。

下一步 > - 部署 DAC,並在 [升級 DAC] 頁面中顯示結果。

取消 - 結束精靈,不部署 DAC。

升級 DAC 頁面

此頁面會報告升級作業成功或失敗。

正在升級 DAC - 報告為了升級 DAC 所採取的每個動作成功或失敗。檢閱資訊以判斷每個動作成功或失敗。發生錯誤的所有動作在 [結果] 資料行中都會有一個連結。選取連結來檢視該動作的錯誤報告。

儲存報表 - 選取此按鈕可將升級報表儲存到 HTML 檔。此檔案會報告每個動作的狀態,包括所有動作所產生的所有錯誤。預設資料夾為 Windows 帳戶之文件資料夾中的 SQL Server Management Studio\DAC Packages 資料夾。

完成 - 結束精靈。

使用 PowerShell 進行 DAC 並存升級

此範例使用 DAC Framework 1.0 Upgrade() 方法執行 DAC 並存升級。在下一版的 SQL Server 中,將會移除 Upgrade() 方法,而且不支援 SQL Azure。慣用的方法是使用 DAC Framework 1.1 IncrementalUpgrade() 方法 (如上述) 執行 DAC 就地升級。

並存升級有兩個升級選項:

  • IngoreDrift - 若為 True,即使偵測到變更,升級仍會繼續。若為 False,當資料庫結構描述不同於舊版 DAC 中所定義的資料庫結構描述時,就會結束升級。

  • InvokeTSPolicy - 若為 True,DAC 伺服器選取原則會經過評估;如果有驗證錯誤,則升級將會結束。若為 False,則不會評估原則。

若要執行就地升級,請建立包含下列程式碼的 PowerShell 指令碼 (例如 UpgradeDAC.ps1) 檔案。

  1. 加入程式碼以建立 SMO Server 物件並將它設定為包含您想要從中擷取 DAC 之資料庫的執行個體。此範例會將 Server 物件設定為本機電腦上的預設執行個體:

    ## Set a SMO Server object to the default instance on the local computer.
    CD SQLSERVER:\SQL\localhost\DEFAULT
    $srv = get-item .
    
  2. 加入程式碼以開啟 ServerConnection 物件並連接至相同的執行個體。

    ## Open a Common.ServerConnection to the same instance.
    $serverconnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($srv.ConnectionContext.SqlConnectionObject)
    $serverconnection.Connect()
    $dacstore = New-Object Microsoft.SqlServer.Management.Dac.DacStore($serverconnection)
    
  3. 加入程式碼以載入 DAC 封裝檔案。此範例會載入 MyApplicationVNext.dacpac 檔案。

    ## Load the DAC package file.
    $dacpacPath = "C:\MyDACs\MyApplicationVNext.dacpac"
    $fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)
    $dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)
    
  4. 加入程式碼以訂閱 DAC 部署事件。

    ## Subscribe to the DAC deployment events.
    $dacstore.add_DacActionStarted({Write-Host `n`nStarting at $(get-date) :: $_.Description})
    $dacstore.add_DacActionFinished({Write-Host Completed at $(get-date) :: $_.Description})
    
  5. 加入程式碼以升級 DAC 並關閉 DAC 封裝檔案:

    ## Upgrade the DAC and create the database.
    $dacName  = "MyApplication"
    $evaluateTSPolicy = $true
    $ignoreDriftOption = $true
    $upgradeProperties = New-Object Microsoft.SqlServer.Management.Dac.DacUpgradeOptions($evaluateTSPolicy, $ignoreDriftOption)
    $dacstore.Upgrade($dacName, $dacType, $upgradeProperties)
    $fileStream.Close()
    

從您已載入 SQL Server PowerShell 嵌入式管理單元的 PowerShell 工作階段,或使用 sqlps 命令提示字元公用程式執行 UgradeDAC.ps1。

請參閱

概念

變更記錄

更新的內容

加入了使用 PowerShell 的相關章節。

已加入有關就地升級以及 DAC Framework 1.1 Feature Pack 的資訊。

SQL Server 2008 R2 SP1 包含 DAC Framework 1.1 及執行就地升級的新 DAC 升級精靈。