【问题标题】:Managing DB Changes in a C# Project管理 C# 项目中的数据库更改
【发布时间】:2011-07-10 17:20:31
【问题描述】:

我有一个 C# 应用程序(在 VisualStudio 2010 中),它使用通过 C# 中的 TableAdapters 访问的 SqlServer 2005。

我还没有找到管理数据库更改的好方法。例如,在我的下一个版本中,我有一堆数据库架构更改。我在 Sql Server Management Studio 中进行了所有数据库更改。但是现在我必须在部署新的应用程序代码后,依次在生产服务器上手动进行这些更改(缓慢且有问题)。

此外,如果我决定将我的版本回滚到以前的版本,我必须手动完成并撤消所有数据库更改,然后才能部署旧代码(现在我处于时间限制之下,因为应用程序已关闭)。同样,这也很容易出错。

哦,希望我的一个错误不会对生产数据库造成大规模破坏,否则我现在必须从存储中取出最近的备份并重试(非常耗时)。

我听说过像 Migrations from Rails(以及像 SubSonic 这样的 ORM)这样的事情。我认为新的 ORM 样式(在 c# 代码中定义你的模式)有助于缓解很多这种情况,但不幸的是,当我使用 TableAdapters 时,我看不到如何实现迁移之类的东西。

人们如何处理这个问题?

【问题讨论】:

  • 为什么“我必须手动完成并撤消所有数据库更改”?只需恢复以前的数据库。

标签: c# sql-server tableadapter


【解决方案1】:

在 Red Gate Software,我们目前正在解决这个确切的问题。请结合SQL Compare Pro查看我们的SSMS插件SQL Source Control。我们还在开发一项将于今年晚些时候推出的“迁移”功能,允许为特定版本转换定义自定义迁移脚本。由于我们仍处于项目的早期阶段,仍有时间give us feedback 帮助我们设计一个出色的解决方案。我们很乐意进一步了解您的要求!

【讨论】:

  • 只是对上述内容的更新 - SQL Source Control 3 和 SQL Compare 10 现在带有上述迁移。
【解决方案2】:

解决这个问题的最简单方法是购买可以通过比较两个数据库更改来检测数据库架构并生成可以更新目标数据库的更改脚本的软件。我为此使用 Visual Studio Ultimate 2010,但也有更便宜的软件可以做到这一点。这对我来说 99% 的时间都有效(唯一对我不起作用的情况是当我重命名表列时)。

如果您没有这样的软件,那么手动生成 SQL 更改脚本至关重要。每当您对数据库架构进行更改时,请跟踪您用于该更改的 SQL,并将其添加到下一个版本的软件的数据库架构更改的一个大文件中。一开始有点乏味,但你很快就会习惯的。

然后,当您准备好部署软件时,请执行以下操作:

  1. 使网站离线
  2. 备份您当前的生产数据库。
  3. 备份您当前的生产网站。
  4. 将新代码上传到服务器
  5. 运行您之前创建的数据库更改脚本(手动或使用上述软件)
  6. 让网站重新上线,看看它是否有效。如果没有并且您无法轻松解决问题,请恢复到以前的网站和数据库版本,直到您修复了错误。

所有这些步骤都可以使用批处理文件和 SQL 服务器代理或 SQLCMD 轻松自动化。

一般来说,您应该先部署到临时服务器,然后非常彻底地测试您的网站,然后再转移到生产服务器。通过这种方式,您可以避免生产服务器出现更长的停机时间,并将丢失任何重要数据的风险降至最低。

【讨论】:

    【解决方案3】:

    数据库的发布管理通常涉及静态数据的迁移和脚本的运行,以更新/创建可编程元素(存储过程、UDF、触发器等)并修改现有的架构定义。在我看来,您缺少脚本。如果您手动对开发数据库进行更改,而不是创建反映这些更改的脚本,则需要对测试/生产环境重复相同的手动步骤,正如您所说的那样容易出错且很危险。

    SQL Server Management Studio 可以轻松保存反映对任何数据库对象所做更改的脚本。在工具栏中应该有一个名为“生成更改脚本”的图标,它使您可以选择将 SQL 文件保存到磁盘。然后,您可以使用它对另一台服务器执行相同的更改。您还可以手动编写任何或所有存储的过程、UDF、触发器等,并在服务器上运行它们(只需右键单击它们)。

    至于回滚,这通常是通过恢复在部署过程开始之前制作的数据库备份来实现的。

    每个公司的整个过程往往不同,但通常是这样完成的。

    自动生成模式的 ORM 在我看来一直很邪恶,更不用说几乎不可能用于生产环境,但我想还有一个选择。

    【讨论】:

    • +1。您肯定需要编写脚本来执行您所做的更改。您还需要经常备份数据库,以便在必要时回滚它们。
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多