Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 以编程方式设置DefaultDataPath和DefaultLogPath(使用SQL语句初始化路径)_Database_Visual Studio 2010_Sql Server 2008_Sql Server 2005_Database Project - Fatal编程技术网

Database 以编程方式设置DefaultDataPath和DefaultLogPath(使用SQL语句初始化路径)

Database 以编程方式设置DefaultDataPath和DefaultLogPath(使用SQL语句初始化路径),database,visual-studio-2010,sql-server-2008,sql-server-2005,database-project,Database,Visual Studio 2010,Sql Server 2008,Sql Server 2005,Database Project,我的问题是使用非硬编码文件位置来初始化变量DefaultDataPath和DefaultLogPath。在采用数据库项目作为我们的标准部署和数据库管理工具以及将现有脚本迁移到数据库项目之前,我们一直在使用创建和初始化脚本集来设置数据库。我们正在使用以下SQL查询创建具有文件位置的数据库: SET @data_path = (SELECT SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1)

我的问题是使用非硬编码文件位置来初始化变量DefaultDataPath和DefaultLogPath。在采用数据库项目作为我们的标准部署和数据库管理工具以及将现有脚本迁移到数据库项目之前,我们一直在使用创建和初始化脚本集来设置数据库。我们正在使用以下SQL查询创建具有文件位置的数据库:

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)
在这里,我们试图找出masterdb的MDF文件的位置,并使用相同的位置创建数据库

问题:对于生成的脚本(在部署操作之后),有一个自动生成的SQLCMD变量,使用一些默认路径(硬编码)或空字符串(使用SQL Server 2008或2005使用的默认数据文件路径)初始化

我们需要让它像我们现有的系统一样工作。我们需要知道主数据库数据和日志文件的路径,并使用相同的路径初始化DefaultDataPath和DefaultLogPath。我们不能使用预部署脚本,因为在将预部署脚本嵌入最终部署脚本之前,数据库设置由数据库项目生成的脚本完成

下一件大事:开发人员需要在SQLServerManagementStudio中切换到SQLCMD模式,以运行DB项目生成的脚本。这是我们的实现团队不使用SQLCMD模式来设置DATBASE的要求。为了克服这些步骤,我需要修改生成的SQL文件,并使用SQL变量而不是SQLCMD变量。我们能否生成干净的SQL语句并保持自动化脚本生成的完整性?我知道这两个问题是相互关联的,因此一个问题的解决方案将解决另一个问题

感谢您对上述讨论提出的任何好建议或帮助

问候


Sumeet不确定如何最好地处理文件路径,尽管我怀疑您不希望使用默认文件路径设置,而是希望使用可以通过变量控制的新文件路径

在我看来,你似乎在试图让开发人员轻松地更新他们的本地机器。我的建议是构建一些批处理文件,以执行以下操作:

  • 设置路径以包含MSBuild.exe的位置
  • 获取主数据库的位置
  • 将该位置传递给变量
  • 运行MSBuild命令将路径变量设置为本地主路径 并发布数据库/更改
总的来说,这听起来比实际值的麻烦多。我建议您向所有开发人员发送一个SQL脚本,让他们正确设置默认数据/日志路径,只使用默认值

我建议您考虑设置一些批处理文件来运行MSBuild命令。如果开发人员不生成脚本并在本地运行,您将可以更轻松地将数据库构建交给他们。或者,您可以让他们更改SSMS默认值,为其连接设置SQLCMD模式。SSDT使这一点变得更好,因为它在并没有打开SQLCMD模式的情况下根本不会运行——消除了VS2008/VS2010数据库项目中的许多混乱

当我们在DB项目中时,我使用了以下类似的方法来构建和部署:

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"

当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\U LOCAL\U MACHINE\SOFTWARE\Microsoft下的键“DefaultLog”和“DefaultData”——它们应该位于同一位置。查看它们是否与脚本生成的设置匹配

您可以在服务器/PC上更改这些位置(无论您指向何处),它将生成您在生成SQL脚本中输入的位置。对于您不拥有的服务器,或用于生产等的服务器,自然要谨慎,因为这将更改服务器上指向SQL server放置新数据库的设置。这与您在SQL Server属性->数据库设置中输入的设置不同


希望有帮助

为了解决SQLCMD问题,您是否可以使用DACPAC部署?
: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\"