序文
データ層アプリケーションプロジェクトとSQLCLRデータベースプロジェクトを使用して、アプリケーションのデータベース部分を管理しています。
データベース部分をインストールする必要がある3つの異なるマシン(ローカル、dev / ci / qa、およびそれに応じてpreprod / prodデプロイメント環境用)があります。
PostDeploymentスクリプトで、CLRストアドプロシージャ(アセンブリを使用)とログインおよびユーザーを作成します。
ログインとユーザーは、構成によって異なる必要があります。
問題
変数の使用に問題があります。これが私が試したPostDeploymentスクリプトです
GO
IF '$(DeploymentConfiguration)' = 'Debug'
BEGIN
:r .\AddLoginsUsersRolesDev.sql
END
ELSE
BEGIN
:r .\AddLoginsUsersRolesProd.sql
END
GO
....
ALTER DATABASE QProduction SET TRUSTWORTHY ON
GO
CREATE ASSEMBLY QProcedures from '[$(MSBuildProjectDir)]\Q.Core.Database.dll' WITH PERMISSION_SET = SAFE
GO
....
と
GO
:setvar databasename "$(TargetDatabase)"
:setvar deploymentconfig "$(DeploymentConfiguration)"
:setvar msbuildprojectdir "$(MSBuildProjectDirectory)"
IF '$(deploymentconfig)' = 'Debug'
BEGIN
:r .\AddLoginsUsersRolesDev.sql
END
ELSE
BEGIN
:r .\AddLoginsUsersRolesProd.sql
END
GO
....
ALTER DATABASE QProduction SET TRUSTWORTHY ON
GO
CREATE ASSEMBLY QProcedures from '[$(msbuildprojectdir)]\Q.Core.Database.dll' WITH PERMISSION_SET = SAFE
GO
....
ログイン、ユーザー(AddLoginsUsersRolesDev.sql)を追加する方法は次のとおりです。
GO
IF NOT EXISTS
(SELECT name
FROM master.sys.server_principals
WHERE name = 'Q\IUSR_Q')
BEGIN
CREATE LOGIN [Q\IUSR_Q] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
END
USE [$(databasename)]
GO
IF NOT EXISTS
(SELECT name
FROM sys.database_principals
WHERE name = 'Q\IUSR_Q')
BEGIN
CREATE USER [Q\IUSR_Q] FOR LOGIN [Q\IUSR_Q]
END
GO
USE [$(databasename)]
GO
EXEC sp_addrolemember N'db_datareader', N'Q\IUSR_Q'
GO
USE [$(databasename)]
GO
EXEC sp_addrolemember N'db_datawriter', N'Q\IUSR_Q'
....
PostDeployment.sqlの場合、アクションはPostDeployであり、SQLCMDモードがオンになっています。インクルードスクリプトの場合、アクションはビルドに含まれていません。
「SQL実行エラー:致命的なエラーが発生しました。変数MSBuildProjectDirectoryが見つかりませんでした」で展開が失敗しました。
私がデータベースプロジェクトで知っている限り、私はこの目的のためにDatabase.sqlcmdvarsを使用することができます。この問題をどのように解決すればよいですか?
アップデート
私は追加しました
<SqlCommandVariablesFile>Database.sqlcmdvars</SqlCommandVariablesFile>
.dbprojファイルに追加し、Database.sqlcmdvarsを作成しました。
<SqlCommandVariables xmlns="urn:Microsoft.VisualStudio.Data.Schema.Package.SqlCmdVars">
<Version>1.0</Version>
<Properties>
<Property>
<PropertyName>databasename</PropertyName>
<PropertyValue>Q</PropertyValue>
</Property>
</Properties>
</SqlCommandVariables>
これは機能しません。
私は追加しました
<ItemGroup>
<SqlCommandVariableOverride Include="databasename=$(TargetDatabase)" />
</ItemGroup>
これも機能しません。
私は追加しました
<PropertyGroup>
<databasename>Q</databasename>
<SetVariables>
<Variable Name="databasename" Value="Q" />
</SetVariables>
</PropertyGroup>
これも機能しません(どこかで、可能性のあるMSBuild変数がsqlcmdと同じ名前で存在するはずだと読んだことがあります)。
PostBuildEventセクションの前にSqlTasks.targetsプロジェクトのインポートを移動しました。
前:
<PropertyGroup>
<PostBuildEvent/>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets" />
後:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets" />
<PropertyGroup>
<PostBuildEvent/>
</PropertyGroup>
これも機能しません。
ありがとう。