Microsoft の Release Management Server for Team Foundation Server 2013 v12.0.31101.0 を使用すると、エラーが発生し続けます (後述)。ただし、ローカル マシン、ビルド サーバー、およびターゲット SQL Server から sqlpackage コマンドを正常に実行できます。
実行した手順:
- dll と sqlpackage.exe を取得し
C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin
て、デスクトップのフォルダーにコピーしました。 - Release Management で、次のコマンドを使用して新しいツールを作成しました。
sqlpackage.exe /Action:Publish /SourceFile:__FileName__ /TargetDatabaseName:__DatabaseName__ /TargetServerName:__ServerName__
- 次に、前の手順で作成したフォルダーから dll と SqlPackage.exe を追加しました
- 保存して閉じます
- 次に、基本的にこのツールをラップするだけの新しいコンポーネントを作成しました (ビルド ドロップの場所は、dacpac がビルド フォルダーのルートにあることを示すバックスラッシュです)。
- 次に、作成したツールを選択すると、すべてが入力されました。コンポーネントを含めて使用するようにリリース テンプレートを更新しました
作成したフォルダーを任意のデスクトップに置くと、次のコマンドを実行でき、完全に実行されます
sqlpackage.exe /Action:Publish /SourceFile:MyDatabase.dacpac /TargetDatabaseName:MyDatabase /TargetServerName:MyDatabaseServer
ローカル PC、ビルド サーバー、および SQL Server 自体からこれを実行しましたが、Release Management を使用するとエラーが発生します。
エラー:
An unexpected failure occurred: The type initializer for 'Microsoft.SqlServer.Dac.DacPackage' threw an exception..
Unhandled Exception: System.TypeInitializationException: The type initializer for 'Microsoft.SqlServer.Dac.DacPackage' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.SqlServer.Dac.DacServices' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SqlSchemaModelStaticState' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.SqlServer.TransactSql.ScriptDom, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
更新 1: Release Management からのエラー メールで、SQL Server がコマンドで正しく指定されていたにもかかわらず、ターゲット サーバーが SQL Server ではなく Web サーバーであることに気付きました。Web サーバーのログを確認したところ、エラーが見つかりました。dll のフォルダーをデスクトップにコピーしてスクリプトを実行したところ、エラーを再現できました。コントロール パネルでインストールされているプログラムを確認したところ、インストールされている Transact-SQL ScriptDom のバージョンが 2012 用で、バージョン 11.0.2100.60 であることがわかりました。そこで、ここに SSDT をインストールしました。Visual Studio がインストールされていないため、インストールは失敗しましたが、12.0.2000.8 バージョンの Transact-SQL ScriptDom と関連する dll をインストールできました。スクリプトを再度実行すると、データベースが正常に公開されました。しかし、Release Management からビルドしようとすると、新しいエラーが発生しました。
Publishing to database 'Logging' on server 'BYDWVCMNSQ01'.
Initializing deployment (Start)
Initializing deployment (Failed)
*** Could not deploy package.
Unable to connect to target server.
更新 2 : この時点で失敗した理由は、ビルド サーバーが使用していたアカウントが SQL Server へのログイン アカウントを持っていなかったためであることを確認しました。アカウントを追加し、対象のデータベースで ddladmin および securityadmin 権限を付与しました。これにより、新しいユーザーを作成できないという新しいエラーが発生しますが、少なくとも近づいています。
最終更新: アカウントがログインを作成できるように、sysadmin も付与する必要がありました。これにより、RM での展開手順が成功しました。公開プロファイルまたはコマンド フラグを使用して、セキュリティ オブジェクトを使用して dacpac が作成されないようにし、最小限の特権で実行できるようにします。
RM を SQL 2014 に展開する際の問題は解決されました。主な問題はリリース テンプレートにあり、DACPAC コンポーネントを Web サーバーの残りのビルドとインラインで配置しました。これにより、DACPAC コマンドが Web サーバーから実行されます。これを機能させるには、SSDT を Web サーバーにインストールする必要がありました。私はこれが気に入らないので、おそらくリリース テンプレートを再配置して、Web サーバーと SQL サーバーが並列になるようにしますが、同じロールバックの下にネストされます。