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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库部署(vsdbcmd.exe):DatabaseName和DefaultDataPath被忽略?相关的知识,希望对你有一定的参考价值。

Visual Studio数据库版本附带了一个工具vsdbcmd.exe,该工具应该允许某人将.dbschema文件(由构建时的数据库项目生成)部署到数据库。它通过首先构建脚本然后执行它来完成此操作:

vsdbcmd.exe / a:Deploy / cs:“Data Source =(local); Integrated Security = True; Pooling = False”/ dsp:Sql / dd /model:"..Database.dbschema“/ p:TargetDatabase = TargetDB /manifest:"..Database.deploymanifest”

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

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

编辑

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

GO
:setvar DatabaseName "TargetDB"
:setvar DefaultDataPath "C:Program FilesMicrosoft SQL ServerMSSQL10.MSSQLSERVERMSSQLDATA"

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

CREATE DATABASE [$(DatabaseName)]
ON 
PRIMARY(NAME = [Original], FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL10.MSSQLSERVERMSSQLDATAOriginal.mdf', SIZE = 3072 KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB)
LOG ON (NAME = [Original_log], FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL10.MSSQLSERVERMSSQLDATAOriginal_log.ldf', SIZE = 1024 KB, MAXSIZE = 2097152 MB, FILEGROWTH = 10 %)

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

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

答案

这可能是在执行数据库模式同步 - >数据库项目时引起的。 (我的环境是VS2010 Enterprise RTM)。

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

编辑在...下找到的文件

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

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

通过上述“校正”,保持外部值将再次起作用,并且是管理这些属性的首选方法。

快乐的编码。

另一答案

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

添加变量

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

在存储文件中,您将找到如下内容:

如果不是EXISTS(SELECT 1 FROM dbo.sysfiles WHERE name ='fgdb_data')BEGIN ALTER DATABASE [$(databasename)] ADD FILE(NAME = N'fgdb_data',FILENAME = N'C: Program Files Microsoft SQL Server MSSQL.1 MSSQL DATA fgdb_data.ndf',MAXSIZE = 100MB,FILEGROWTH = 10MB)TO FILEGROUP [TABLES] END

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

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

如果不是EXISTS(SELECT 1 from dbo.sysfiles WHERE name ='fgdb_data')BEGIN ALTER DATABASE [$(databasename)] ADD FILE(NAME = N'fgdb_data',FILENAME = N'$(drive) $(directory) fgdb_data.ndf',MAXSIZE = 100MB,FILEGROWTH = 10MB)TO FILEGROUP [TABLES] END

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

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

以上是关于数据库部署(vsdbcmd.exe):DatabaseName和DefaultDataPath被忽略?的主要内容,如果未能解决你的问题,请参考以下文章

构建数据库项目不会生成 dbschema 文件

chart 目录结构 - 每天5分钟玩转 Docker 容器技术(164)

数据库读取方法

CI框架

MySQL存储

属性拓展,