2

序文

データ層アプリケーションプロジェクトと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セクションの前にSqlTask​​s.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>  

これも機能しません。

ありがとう。

4

1 に答える 1

0

sqlcmdvarsはサポートされていないようです。少なくとも、dacpacには「該当なし」とマークされています。

于 2011-11-11T12:53:12.220 に答える