前言
我使用数据层应用程序项目和 SQL CLR 数据库项目来管理我的应用程序的数据库部分。
我有 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>
这也行不通。
谢谢。