12

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 /清单:“..\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 是原始数据库的名称(即我们在开发过程中部署的数据库,在数据库项目的项目属性中设置)。这是部署失败的地方,要么是因为目标机器上的确切路径可能不同,要么在我的机器上,因为该数据库已经存在。

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

4

2 回答 2

5

这可能是(是)在执行Database Schema Synchronization -> Database Project时引起的。(我的环境是VS2010 Enterprise RTM)。

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

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

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

...并修复它们以包含正确的$(DefaultDataPath)$(DatabaseName).mdf/$(DefaultLogPath)$(DatabaseName)_log.ldf值 - 或其他 - 视情况而定。(现在在您的架构比较中将它们标记为“跳过”:-P)

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

快乐编码。

于 2010-12-30T23:52:04.383 回答
1

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

添加变量

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

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

IF NOT 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 驱动器 "C:" :setvar 目录 "Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA"

如果不存在(从 dbo.sysfiles 中选择 1,其中名称 = 'fgdb_data')开始更改数据库 [$(数据库名称)] 添加文件(名称 = N'fgdb_data', 文件名 = N'$(驱动器)\$(目录)\ fgdb_data.ndf', MAXSIZE = 100MB, FILEGROWTH = 10MB ) TO FILEGROUP [TABLES] END

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

抱歉,我自己刚开始学习 GDR,但我需要这个问题的答案

于 2009-04-28T04:23:30.927 回答