数据库部署 (vsdbcmd.exe):DatabaseName 和 DefaultDataPath 被忽略?
Posted
技术标签:
【中文标题】数据库部署 (vsdbcmd.exe):DatabaseName 和 DefaultDataPath 被忽略?【英文标题】:Database deploy (vsdbcmd.exe): DatabaseName and DefaultDataPath are ignored? 【发布时间】:2009-03-31 07:33:59 【问题描述】: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 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 是原始数据库的名称(即我们在开发期间部署的数据库,并且在数据库项目的项目属性中设置)。这是部署失败的地方,要么是因为目标机器上的确切路径可能不同,要么在我的机器上因为该数据库已经存在。
这些值似乎只是硬编码在生成的脚本中。
【问题讨论】:
【参考方案1】:这可能是在执行数据库模式同步 -> 数据库项目时引起的。 (我的环境是VS2010 Enterprise RTM)。
生成的 ALTER DATABASE 语句用于镜像 源 数据库而不考虑任何替换值(它还将包括初始数据库大小等)。该问题不会出现在初始数据库导入中。
编辑在...下找到的文件
架构对象\数据库级对象\存储\文件
...并修复它们以包含正确的$(DefaultDataPath)$(DatabaseName).mdf
/$(DefaultLogPath)$(DatabaseName)_log.ldf
值——或其他——视情况而定。 (现在在您的架构比较中将它们标记为“跳过”:-P)
通过上述“更正”,保持外部值将再次起作用,并且是管理此类属性的首选方法。
编码愉快。
【讨论】:
酷。我会接受你的回答,因为我相信它会起作用,但没有检查过 - 已经换了工作:) 同样的问题,但是我这个目录下没有文件。【参考方案2】:根据您的编辑,也许这会有所帮助。 https://blogs.msdn.com/gertd/Default.aspx?p=7
添加变量
到目前为止,我们一直在研究事物是如何工作的,现在是时候添加一些新变量并让它们发挥作用了。变量派上用场的一个地方是在定义文件的部署后文件中:storage.sql。变量将允许使用使位置环境依赖。
在存储文件中你会发现这样的东西:
如果不存在(从 dbo.sysfiles 中选择 1,其中名称 = 'fgdb_data') 开始 ALTER DATABASE [$(databasename)] 添加文件 ( NAME = N'fgdb_data', 文件名 = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\fgdb_data.ndf', 最大尺寸 = 100MB, 文件增长 = 10MB ) 到文件组 [表] 结束
我们可以对其进行参数化,以便通过变量将驱动器和目录抽象为:
:setvar 驱动器 "C:" :setvar 目录 "Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA"
如果不存在(从 dbo.sysfiles 中选择 1,其中名称 = 'fgdb_data') 开始 ALTER DATABASE [$(databasename)] 添加文件 ( NAME = N'fgdb_data', FILENAME = N'$(驱动器)\$(目录)\fgdb_data.ndf', 最大尺寸 = 100MB, 文件增长 = 10MB ) 到文件组 [表] 结束
现在我们已经参数化了脚本,接下来我们想让变量成为项目文件的一部分,所以我们将它们定义在一个地方,而不是通过 :setvar 语句分散在代码中的各个地方。
抱歉,我自己刚刚开始学习 GDR,但我需要这个问题的答案
【讨论】:
不起作用。在生成的 .sql 文件中,实际 .mdf 文件的路径似乎是硬编码的 - 即它不在变量中。我将编辑我的问题。 我根据您的反馈编辑了我的帖子,我仍在学习 GDR,我想了解自己的工作原理 仅此而已(请参阅我的编辑) - 默认情况下已经存在此类变量(DatabaseName 和 DefaultDataPath),但它们并未在脚本中的某个特定位置使用,创建数据库的位置。以上是关于数据库部署 (vsdbcmd.exe):DatabaseName 和 DefaultDataPath 被忽略?的主要内容,如果未能解决你的问题,请参考以下文章
could not make a database connection using datab
java 保持Firebase实时数据库连接最小化(https://livinglifetechway.com/keep-your-firebase-realtime-database-connect
TypeError: ‘Collection‘ object is not callable. If you meant to call the ‘insert‘ method on a ‘Datab
Installation failed with message INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.datab.cn signatures