数据库部署(vsdbcmd.exe):DatabaseName和DefaultDataPath被忽略?

时间:2009-03-31 07:34:00

标签: visual-studio visual-studio-2008 database-project

Visual Studio的数据库版本附带的工具,vsdbcmd.exe,应该让别人来部署.dbschema文件(这是由在建数据库项目产生的)到数据库。它通过首先构建脚本然后执行它来完成此任务:

  

vsdbcmd.exe /一个:部署/ CS: “数据源=(本地);集成安全性= TRUE;池=假”/ DSP:SQL / DD /model:"..\Database.dbschema” / P: TargetDatabase = TargetDB / manifest:“.. \ Database.deploymanifest”

我希望它可以将脚本部署到不同的数据库服务器而不会出现问题。但是,实际的.mdf文件的完整路径在脚本中编码,以及对原始数据库的一些其他引用。要么没有控制它的选项,要么我找不到它。

有人用这个吗?你如何部署?我应该使用不同类型的数据库项目(我记得在“数据库项目”和“服务器项目”之间有选择的方式,但我不知道这是否重要)?

修改

我可以覆盖.sqlcmdvars就好了,但这并没有解决问题。这是使用上面的命令生成的.sql文件的摘录:

GO
:setvar DatabaseName "TargetDB"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\"

因此,正确记录了“targetdb”目标数据库。但是,进一步说:

CREATE DATABASE [$(DatabaseName)]
ON 
PRIMARY(NAME = [Original], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original.mdf', SIZE = 3072 KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB)
LOG ON (NAME = [Original_log], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original_log.ldf', SIZE = 1024 KB, MAXSIZE = 2097152 MB, FILEGROWTH = 10 %)

其中Original.mdf是原始数据库的名称(即我们在开发期间部署的数据库,它是在数据库项目的项目属性中设置的)。这是部署失败的地方,因为在目标计算机上或我的计算机上的确切路径可能不同,因为该数据库已经存在。

这些值在生成的脚本中似乎是硬编码的。

2 个答案:

答案 0 :(得分:5)

执行数据库模式同步 - >时,可能会导致这种情况。数据库项目。 (我的环境是VS2010 Enterprise RTM)。

生成生成的ALTER DATABASE语句以镜像数据库,而不考虑任何替换值(它还将包括初始数据库大小等)。该问题不会出现在初始数据库导入中。

编辑在......

下找到的文件

架构对象\数据库级对象\存储\文件

...并根据需要修复它们以包含正确的$(DefaultDataPath)$(DatabaseName).mdf / $(DefaultLogPath)$(DatabaseName)_log.ldf值或其他值。 (现在在Schema Compare中标记为“Skip”:-P)

通过上述“修正”,保持外部价值将再次发挥作用,是管理此类财产的首选方法。

快乐的编码。

答案 1 :(得分:1)

根据您的编辑,这可能会有所帮助。 https://blogs.msdn.com/gertd/Default.aspx?p=7

添加变量

到目前为止,我们一直在研究事情是如何运作的,现在是时候添加一些新变量并将它们付诸实践了。变量派上用场的地方是定义文件的后部署文件:storage.sql。变量将允许用于使位置环境依赖。

在存储文件中,你会发现如下内容:

如果不是EXISTS(从dbo.sysfiles中选择1 WHERE name ='fgdb_data') 开始 ALTER DATABASE [$(databasename)] 添加文件 ( NAME = N'fgdb_data', FILENAME = N'C:\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA \ fgdb_data.ndf', MAXSIZE = 100MB, FILEGROWTH = 10MB ) 到FILEGROUP [TABLES] END

我们可以对此进行参数化,以便通过变量将驱动器和目录抽象为:

:setvar drive“C:” :setvar目录“Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA”

如果不是EXISTS(从dbo.sysfiles中选择1 WHERE name ='fgdb_data') 开始 ALTER DATABASE [$(databasename)] 添加文件 ( NAME = N'fgdb_data', FILENAME = N'$(驱动器)\ $(目录)\ fgdb_data.ndf', MAXSIZE = 100MB, FILEGROWTH = 10MB ) 到FILEGROUP [TABLES] END

现在我们已经对脚本进行了参数化,接下来我们要将变量作为项目文件的一部分,因此我们将它们定义在一个地方而不是分散在代码中的各个地方通过:setvar语句。

对不起,我刚刚开始自己​​学习GDR,但我需要答案