DAC パッケージの検証

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

DAC パッケージを運用環境に配置する前にパッケージの内容を確認し、既存の DAC をアップグレードする前にアップグレード処理を検証するようにしてください。 これは、特に、外部で開発されたパッケージを配置する場合に当てはまります。

DAC パッケージをアップグレードする方法は次のとおりです。

信頼されていない DAC パッケージ

ソースが不明または信頼されていない DAC パッケージは配置しないことをお勧めします。 こうした DACs には、意図しない Transact-SQL コードを実行したり、スキーマを変更してエラーを発生させるような、悪意のあるコードが含まれている可能性があります。 DAC のソースが不明または信頼されていない場合は、使用する前に、データベース エンジンの隔離されたテスト インスタンスに DAC を配置し、データベースに対して DBCC CHECKDB (Transact-SQL)を実行してください。また、ストアド プロシージャやその他のユーザー定義コードなど、データベースのコードを確認してください。

DAC の内容の表示

データ層アプリケーション (DAC) パッケージの内容を表示する方法は 2 つあります。

  • 1 つは、SQL Server 開発者ツールの SQL プロジェクトに DAC パッケージをインポートする方法です。
  • DAC パッケージをテスト インスタンスに発行する

SQL Server Developer ツールでの DAC のインポート

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [SQL Server] プロジェクト テンプレートを選択し、 [名前][場所]、および [ソリューション名]を指定します。

  3. ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[プロパティ] を選択します。

  4. [プロジェクトの設定] タブの [出力の種類] セクションで [データ層アプリケーション (.dacpac File)] チェック ボックスをオンにし、プロパティ ダイアログ ボックスを閉じます。

  5. ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[データ層アプリケーションのインポート] をクリックします。

  6. ソリューション エクスプローラー を使用して、サーバーの選択ポリシーや配置前スクリプトと配置後スクリプトなど、DAC 内のすべてのファイルを開くことができます。

  7. スキーマ ビュー を使用すると、スキーマ内のすべてのオブジェクトを確認できます。特に、関数やストアド プロシージャなどのオブジェクトのコードを確認します。

DAC パッケージをテスト インスタンスに発行する

DAC パッケージをテスト インスタンスに発行するには、複数のツールを使用できます。 Azure Data Studio の SQL Server Dacpac 拡張機能には、Dデータ層アプリケーション ウィザードが含まれています。 DAC パッケージをテスト インスタンスに発行する手順について説明します。

  1. 必要に応じて、デプロイ ウィザードを使用してテスト インスタンスを デプロイします

  2. Azure Data Studio でテスト インスタンスに接続し、サーバー ノードを右クリックします。 コンテキスト メニューから [データ層アプリケーション ウィザード] を選択します。

  3. ウィザードの手順 1 で、[データ層アプリケーションの .dacpac ファイルを SQL Server のインスタンスに配置する] を選択 します。

  4. ウィザードの手順 2 の 1 つで、ファイルの場所を入力し、ターゲット データベースの [新しいデータベース] を選択します。 データベース名を入力します。

  5. ウィザードの手順 3 で、[デプロイ] を選択する前に概要を確認します。

  6. デプロイが完了したら、オブジェクト エクスプローラーでデータベースの内容を確認します。

  7. 省略可能: オブジェクト エクスプローラーでデータベースを右クリックし、[データベースからプロジェクトを作成] を選択 して、データベース から SQL プロジェクトを生成します。

データベースの変更の表示

現在のバージョンの DAC を実稼働環境に配置した後で、関連付けられているデータベースが直接変更され、その変更内容が新しいバージョンの DAC で定義されているスキーマと矛盾する場合があります。 新しいバージョンの DAC にアップグレードする前に、そのような変更がデータベースに対して行われたかどうかを確認してください。 いくつかのシナリオでは、データベースと DAC パッケージの違いを確認できます。 たとえば、関連付けられているデータベースが直接変更され、その変更内容が新しいバージョンの DAC で定義されているスキーマと矛盾する場合があります。

[すべてのデータベース]

スキーマ比較を使用してデータベースの変更を表示する

  • Azure Data Studio で Schema Compare 拡張機能を使用すると、既存の .dacpac と 1 つまたは 2 つのデータベースのスキーマの違いを、Windows、macOS、Linux で確認できます。

  • Visual Studio で SQL Server Data Tools を使用すると、既存の .dacpac と 1 つまたは 2 つのデータベースのスキーマの違いを Windows で表示できます。

SqlPackage CLI を使用してデータベースの変更を表示する

SqlPackage CLI を DeployReport アクションと共に使用すると、.dacpac がデータベースに発行された場合に実行されるアクションを使用して、.dacpac とデータベースの違いを表示できます。

データ層アプリケーションとして登録されたデータベース

ウィザードの使用によるデータベースの変更の表示

  1. 現在配置されている DAC と、新しいバージョンの DAC を含む DAC パッケージを指定して、 データ層アプリケーションのアップグレード ウィザードを実行します。

  2. [変更の検出] ページで、データベースに対する変更のレポートを確認します。

  3. アップグレードを続行しない場合は、 [キャンセル] をクリックします。

  4. ウィザードの使用方法については、「 データ層アプリケーションのアップグレード」を参照してください。

PowerShell の使用によるデータベースの変更の表示

  1. SMO サーバー オブジェクトを作成し、表示する DAC を含んだインスタンスに設定します。

  2. ServerConnection オブジェクトを開いて、同じインスタンスに接続します。

  3. DAC の名前を変数で指定します。

  4. GetDatabaseChanges() メソッドを使用して ChangeResults オブジェクトを取得し、そのオブジェクトをテキスト ファイルにパイプして、新しいオブジェクト、削除したオブジェクト、および変更したオブジェクトを含む簡単なレポートを生成します。

次の例は、MyApplicaiton という名前のデプロイされた DAC で行われた、データベースのすべての変更のレポートを生成します。

## Set a SMO Server object to the default instance on the local computer.  
CD SQLSERVER:\SQL\localhost\DEFAULT  
$srv = get-item .  
  
## 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)  
  
## Specify the DAC instance name.  
$dacName  = "MyApplication"  
  
## Generate the change list and save to file.  
$dacChanges = $dacstore.GetDatabaseChanges($dacName) | Out-File -Filepath C:\DACScripts\MyApplicationChanges.txt  

SqlPackage CLI を使用してデータベースの変更を表示する

SqlPackage CLI が DriftReport アクションと共に使用すると、データベースが最後に登録されてからデータベースに行われた変更を表示することができます。

アップグレード処理の表示

[すべてのデータベース]

SQL プロジェクトの発行を使用してデータベースの変更を表示する

  • Azure Data Studio で SQL Database Projects 拡張機能 を使用すると、SQL プロジェクトがデータベースに発行されるときに実行されるアクションは、発行プロセス中に [スクリプトの生成] を選択することで、Windows、macOS、Linux で表示できます。

  • Visual Studio で SQL Server Data Tools を使用すると、SQL プロジェクトがデータベースに発行されるときに実行されるアクションを、Windows 上で配置スクリプトとして表示できます。

SqlPackage CLI を使用してアップグレード アクションを表示する SqlPackage CLI を DeployReport アクションと共に使用すると、.dacpac がデータベースに発行された場合に実行されるアクションを使用して、.dacpac とデータベースの違いを表示できます。

データ層アプリケーションとして登録されたデータベース

DAC パッケージの新しいバージョンを使用して前の DAC パッケージから配置された DAC をアップグレードする前に、アップグレード中に実行される Transact-SQL ステートメントを含むレポートを生成して、ステートメントを確認することができます。

ウィザードの使用によるアップグレードの処理のレポート生成

  1. 現在配置されている DAC と、新しいバージョンの DAC を含む DAC パッケージを指定して、 データ層アプリケーションのアップグレード ウィザードを実行します。

  2. [概要] ページで、アップグレード処理のレポートを確認します。

  3. アップグレードを続行しない場合は、 [キャンセル] をクリックします。

  4. ウィザードの使用方法については、「 データ層アプリケーションのアップグレード」を参照してください。

PowerShell の使用によるアップグレードの処理のレポート生成

  1. SMO サーバー オブジェクトを作成し、配置された DAC を含んだインスタンスに設定します。

  2. ServerConnection オブジェクトを開いて、同じインスタンスに接続します。

  3. System.IO.File を使用して、DAC パッケージ ファイルを読み込みます。

  4. DAC の名前を変数で指定します。

  5. GetIncrementalUpgradeScript() メソッドを使用して、アップグレードで実行される Transact-SQL ステートメントのリストを取得し、リストをテキスト ファイルにパイプします。

  6. DAC パッケージ ファイルの読み取りに使用するファイル ストリームを閉じます。

次の例は、MyApplicaiton という名前の DAC を MyApplication2017.dacpac ファイルで定義されているスキーマにアップグレードするために実行される Transact-SQL ステートメントのレポートを生成します。

## Set a SMO Server object to the default instance on the local computer.  
CD SQLSERVER:\SQL\localhost\DEFAULT  
$srv = get-item .  
  
## 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)  
  
## Load the DAC package file.  
$dacpacPath = "C:\MyDACs\MyApplication2017.dacpac"  
$fileStream = [System.IO.File]::Open($dacpacPath,[System.IO.FileMode]::OpenOrCreate)  
$dacType = [Microsoft.SqlServer.Management.Dac.DacType]::Load($fileStream)  
  
## Specify the DAC instance name.  
$dacName  = "MyApplication"  
  
## Generate the upgrade script and save to file.  
$dacstore.GetIncrementalUpgradeScript($dacName, $dacType) | Out-File -Filepath C:\DACScripts\MyApplicationUpgrade.sql  
  
## Close the filestream to the new DAC package.  
$fileStream.Close()  

DAC の比較

DAC をアップグレードする前に、現在の DAC と新しい DAC に、データベースレベルおよびインスタンスレベルでオブジェクトにどんな相違があるか確認してください。 現在の DAC パッケージのコピーがない場合は、現在のデータベースからパッケージを抽出できます。

SQL Server 開発者ツールで両方の DAC パッケージを DAC プロジェクトにインポートする場合は、スキーマ比較ツールを使用して 2 つの DAC 間の相違を分析できます。

または、DAC を別々のフォルダーにアンパックします。 その後、WinDiff ユーティリティなどの比較ツールを使用して、相違を分析できます。

参照

データ層アプリケーション
データ層アプリケーションの配置
データ層アプリケーションのアップグレード