web-dev-qa-db-ja.com

SQLCMD導入後スクリプトからaspnet_regsql.exeを実行します

SSDTで展開後のスクリプトを作成しようとしています。これには、ASP.NETセッション状態データベースの作成が含まれ、データベースプロジェクトの展開後に全員がこのスクリプトを確実に実行できるようにします。

次のコマンドは、データベースがまだ配置されていない場合にデータベースを作成します。

C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -sstype c -S localhost -d ASPSTATE -E

最初は、一般的にSQLCMDスクリプトの一部として実行してみました。 SQLCMDモードでの次のアプローチ:

:!!C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -sstype c -S localhost -d myStateDb -E

次に、基本的に同じ方法で、展開後のスクリプトにそれを含めようとしました。

:!!C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -sstype c -S localhost -d TESTdb -E

これは、VisualStudioコンパイラがこの行のバックスラッシュについて不平を言うことになります。

「SQL72007:構文チェックに失敗しました。近くのバッチの「\」に近い構文エラー:[上記のコマンド]」

SSMSで機能しているので、展開後のスクリプトが文句を言い続ける理由がわかりません。

2
Magier

SQL Server Management Studio(SSMS)はSQLCMDコマンドのサブセットのみをサポートし、SQL Serverデータツール(SSDT)はSSMSで許可されているSQLCMDコマンドのサブセットのみをサポートします。 [:]!! SQLCMDコマンドは、SSMSでサポートされていますが、SSDTの展開前または展開後のSQLスクリプトではサポートされていません。これは、[:]!! SQLCMDコマンドによって実行されるコマンドが、SQLCMDが実行されているマシンで実際に実行されていることに気付いていないために発生する可能性が高い、大量の混乱が原因である可能性があります。実行間で一貫性があり、SQLServerが実行されているマシンと必ずしも同じであるとは限りません。

たとえば、ローカルワークステーションまたはラップトップでVisual Studioで開発を行い、この展開を実行すると、コマンドはローカルワークステーションまたはラップトップで実行されます。次に、テスト/ QAにデプロイする場合、そのデプロイメントを実行するすべてのマシンで実行されます。これは通常、ローカルワークステーションではありません。そして、本番環境にデプロイすると、ビルドサーバーで再度実行されます。ビルドサーバーは、QAサーバーへのデプロイを処理したサーバーと同じである場合とそうでない場合があります。

Post-Deploymentを次のように変更してから、ビルドを実行する場合:

:!! dir

次に、このエラーが表示されます。

72006:致命的なスクリプトエラー:コマンド実行はサポートされていません。

あなたには3つの選択肢があります(少なくとも私は考えることができます):

  1. aspnet_regsql.exeを介してxp_cmdshellを実行します(これは、SQLSERVERサービスに関連付けられたログオンアカウントのセキュリティコンテキストで実行されます)。このオプションを使用すると、デプロイメントSQLスクリプト内でaspnet_regsql.exeの呼び出しを管理でき、ビルドを実行するたびに実行されます。

  2. 「ビルド後のイベント」を編集して、これと同じコマンドラインを呼び出します。これにより、aspnet_regsql.exeは、展開を実行するWindows/ActiveDirectoryログインのセキュリティコンテキストで実行できるようになります。ただし、aspnet_regsql.exeの実行はSQLスクリプトに含まれていないため、公開プロセスでは SqlPackage.exe を使用して、「ビルド後のイベント」にあるコマンドを実行できるようにする必要があります。 "。ただし、これは少なくともSSDT公開プロセスの一部であり、ビルドを実行すると実行されます。

  3. SQL Serverを実行しているサーバーで実行されるCMDスクリプトを作成し、SQLCMDを呼び出して展開SQLスクリプトを実行してから、aspnet_regsql.exeを実行することにより、SSDT展開の外部でこれを処理します。ただし、このオプションはSSDT公開プロセスの外部にあり、VisualStudioでビルドを実行するときに実行されません。

2
Solomon Rutzky