2

我在 Visual Studio 2010 中有一个 SQL 2008 数据库项目,该项目在开发阶段定期从模式比较中同步。同样的项目也在 TFS 源代码控制之下。我有两个环境,调试和生产。每个环境都是一台同时运行 IIS 和 SQL Server 的机器。然而,生产环境对于数据库 D:\Data\ 和 E:\Logs\ 与我在标准 c:\program files\sql....\data 上的开发服务器具有不同的数据和日志路径。

我想要做的是设置我处理从调试到生产环境的部署的方式。我已经安装了 WebDeploy 2.1,并通过网站项目上的右键单击上下文菜单在 Visual Studio 中构建了我的部署包。我想通过 RDP 手动将部署包复制到生产服务器,所以这里没有网络问题。部署包设置设置为包括在包/发布 SQL 选项卡中配置的所有数据库。在 Package/Publish SQL 选项卡中,我不会从现有数据库的数据/模式中提取数据,因为我想从 SQL 数据库项目中进行部署。所以我只是指向位于我的数据库项目的 /sql/release 文件夹中的预先生成的 .sql 脚本文件。最重要的是,我通过 VSDBCMD 在 SQL 项目的构建后事件中生成 .sql 脚本。

这很好,但我在这里有一个似乎无法克服的主要问题。它与从调试环境到生产环境不同的数据库数据和日志文件路径有关。我实际上在生产服务器上的 IIS 中的 WebDeploy 期间收到一个异常,它说它找不到 c:\programs files...\MyDatabase.mdf 文件。可怕的是,在这个异常之后,整个数据库都被删除了。我在进行部署之前创建的空数据库。两次都发生了,我试图弄乱它。我不确定我对此有何感受,但我希望我能找到一个可靠的解决方案。

我一直在狂热地寻找一种在部署期间更改路径的方法,并发现许多地方提到更改 Schema Objects\Database level objects\Storage\Files 下的 *.sqlfiles.sql 文件中的路径,因为它试图更改路径deploy to 是由于 Debug SQL server 数据库中的架构比较和写入而指定的路径。在此处更改路径将暂时起作用,直到我进行下一次架构比较并写入,然后 sqlfiles.sql 文件将再次被 Debug 数据库中的信息覆盖。而且我不想记住在模式比较期间永远不要更新这些文件,因为任何错误都有可能删除生产数据库。

我认为我的救赎在于我的 Release.sqlcmdvars 文件。这实际上是一个笑话,我可以看到一个我“可以”键入默认数据库路径的地方,但它似乎是一个只读字段,因为它提到“默认创建数据库文件的位置(在部署时设置)”。如果我可以在这里指定路径,那就太好了。有没有办法在此处指定变量中的路径来覆盖 *.sqlfiles.sql 文件中的路径?

在我工作的解决方案中,sqlcmdvar 中有两个名为 Path1 和 Path2 的自定义变量,我认为它们是执行此操作的保留名称。但是,这在我的解决方案中不起作用,两个解决方案之间的区别在于另一个解决方案是通过 TFS 构建控制器部署的。执行 TFS 构建控制器路由并不是一个真正的选择,因为我在使用第三方源代码控制服务时选择退出以节省资金。

对此的任何帮助都会很棒。我什至为调试和发布创建单独的 *.sqlfiles.sql 文件,并将 dbproj 文件配置为根据配置使用其中一个或另一个,但这似乎也不起作用。此外,使用 sqlfile.sql 文件中的自定义 PATH1 变量(如 FILENAME = '$(PATH1)\Cameleon_log.ldf')也不起作用。我认真地认为这不应该这么难。我在这里错过了一些简单的东西吗?

谢谢!

4

1 回答 1

0

好吧,这是徒劳的练习。显然,在脚本生成期间没有与目标数据库同步,该脚本正是从头开始构建数据库所需要的。即使我可以覆盖文件路径,部署也会抱怨数据库对象已经存在。我需要在部署设置中指定目标数据库的连接字符串,以便在脚本生成期间进行比较,并且只将相关差异添加到脚本中。我真的很想避免将我的生产 SQL 服务器暴露给外界,但事实就是如此。不再需要覆盖路径,因为在此比较过程中看起来数据库文件路径被方便地忽略了!!

于 2012-04-10T14:36:02.813 回答