我的查询是关于使用NOT硬编码文件位置来初始化Variables DefaultDataPath和DefaultLogPath。在采用数据库项目作为我们的标准部署和数据库管理工具并将现有的脚本迁移到数据库项目之前,我们一直使用SET CREATE和INITIALIZE脚本来设置数据库。我们正在使用SQL Query来创建具有FILE位置的数据库:
SET @data_path = (SELECT SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1)
FROM sys.sysaltfiles WHERE dbid = 1 AND fileid = 1);
set @mdb_file=@data_path + 'CF_DB.mdf'
set @cfdata='CF_DB_Data'
set @cflog='CF_DB_Log'
set @ldf_file=@data_path + 'CF_DB_log.ldf'
declare @sql nvarchar(500)
set @sql = 'CREATE DATABASE [CF_DB] ON (NAME = ' + quotename(@cfdata) + ',FILENAME =' + quotename(@mdb_file) + ',SIZE = 53, FILEGROWTH = 10%) LOG ON (NAME =' + quotename(@cflog) + ',FILENAME = ' + quotename(@ldf_file) + ', SIZE = 31, FILEGROWTH = 10%)COLLATE SQL_Latin1_General_CP1_CI_AS'
exec(@sql)
这里我们试图找出MASTER DB的MDF文件的位置,并使用相同的位置来创建数据库。
问题:生成脚本(在部署操作之后),有一个自动生成的SQLCMD变量,用一些默认路径(硬编码的)或空字符串(使用SQL Server 2008或2005使用的默认数据文件路径)初始化
:setvar DatabaseName "CF"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\"
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\"
我们需要让它像我们现有的系统一样工作。我们需要知道MASTER DB数据和日志文件的路径,并使用相同的路径来初始化DefaultDataPath和DefaultLogPath。我们无法使用PreDeployment脚本,因为在将PreDeploymentScript嵌入到最终的部署脚本中之前,数据库设置由Database Project生成的脚本完成。
NEXT重大事项:开发人员需要在SQL Server Management Studio中切换到SQLCMD模式,以运行DB Project生成的脚本。这是我们的实施团队要求不使用SQLCMD模式来设置DATBASE。为了克服这些步骤,我需要修改生成的SQL文件并使用SQL变量而不是SQLCMD变量。我们可以生成干净的SQL语句并保持自动化脚本生成完整吗?我知道这两个问题都是相互关联的,因此一个解决方案就是修复另一个问题。
感谢您对上述讨论提出任何好的建议或帮助。
此致
Sumeet
答案 0 :(得分:0)
不确定如何最好地处理文件路径,但我怀疑您不想使用默认文件路径设置,而是使用可以通过变量控制的新文件路径。
听起来像是在尝试让开发人员轻松更新本地计算机。我的建议是构建一些执行以下操作的批处理文件:
总的来说,这听起来比实际值得多麻烦。我建议您向所有开发人员发送一个SQL脚本,让他们正确设置他们的默认数据/日志路径,并使用默认值。
我建议您考虑设置一些批处理文件来运行MSBuild命令。您可以更轻松地将数据库构建交给开发人员,而无需他们生成脚本并在本地运行它们。或者,您可以让他们更改其SSMS默认值,以便为其连接设置SQLCMD模式。 SSDT使这个更好一点,因为它不会在没有打开SQLCMD模式的情况下运行 - 消除了VS2008 / VS2010 DBProjects的大量混乱。
当我们使用DB Projects时,我使用了类似以下内容来构建和部署:
msbuild /m .\MyDB\MyDB.dbproj /t:build
msbuild /m .\MyDB\MyDB.dbproj /t:deploy /p:TargetConnectionString="Data Source=localhost;Integrated Security=True;Pooling=False;" /p:TargetDatabase="MyDB"
答案 1 :(得分:0)
当SSDT / VS生成SQL文件时,它实际上会针对您告诉它连接的服务器运行一些查询。你在这里得到的设置......
:setvar DatabaseName "CF"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\"
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\"
从您在发布文件/配置文件中指定的目标数据库连接的服务器设置中获取。
在用于生成脚本的服务器上,打开regedit.exe并在 HKEY_LOCAL_MACHINE下搜索“ DefaultLog ”和“ DefaultData ”键\ SOFTWARE \ Microsoft - 它们应位于同一位置。看看它们是否与您的脚本生成的设置相匹配。
您可以在服务器/ PC(您指向的位置)上更改这些内容,它将生成您在生成SQL脚本中输入的位置。在您不拥有的服务器或用于生产等的服务器周围要小心谨慎,因为这会更改服务器上指向SQL Server放置新数据库的位置的设置。这是一个与您在SQL Server属性中输入的设置不同的设置 - >数据库设置。
希望有所帮助!