【问题标题】:SQL Server DB changes deploymentSQL Server 数据库更改部署
【发布时间】:2013-07-05 10:43:07
【问题描述】:

我正在努力跟上数据库更改以及如何干净地维护和部署从 Dev 到 PRD 从一个版本到另一个版本的数据库更改。

目前,我使用 SQL 脚本来确定自上次发布以来发生了哪些变化;

  • Procs 和 Views 更容易推进,因为我可以简单地删除并重新创建(如果存在)。
  • 表更改更加困难,因为不能简单地删除现有表。

但我认为我无法理解的主要问题是,我们在任何两个主要 PRD 版本之间都有多个针对 Dev 和 UAT 的迷你版本。

Dev 和 UAT mini 版本还可以,因为我从其他开发人员那里获得了更改列表,我将其与我的合并,然后发布了,而且我是 Dev 和 UAT 数据库的系统管理员,所以我确切地知道什么是否存在,当我应用更改时会发生什么。

对于 PRD,我必须准备一个干净的脚本并将其交给 DBA,以便他可以在那里运行它,但除了 PRD 上的表名、列和数据之外,我无法查看其他任何内容。

PRD 的这个脚本应该捕获几乎所有进入迷你版本的东西,但大多数时候这些迷你版本不是连续的,有时会相互否定,因为一个添加了功能 A,然后后续版本删除了功能 A,但是对于 PRD,我们可能必须添加功能 A,因此无需发布第二个迷你版本,这将有效地删除功能 A。

简而言之,我正在寻找管理和跟踪版本之间数据库更改的方法,以及为数据库更改构建部署脚本的好方法。

注意:我在 TFS 中保留了一份手动维护的所有 SQL 对象的副本。

我尝试使用数据库项目,但我没有很幸运地实现了我想要的。

有什么想法吗?非常感谢任何帮助

【问题讨论】:

    标签: tsql sql-server-2005 deployment dbdeploy


    【解决方案1】:

    我对 TFS 不熟悉,我使用过 Git(以前使用过 CVS 和 SVN),因此请正确看待这个答案。

    SQL 位的管理和版本控制是我最糟糕的噩梦。 有一些工具可以简化变更管理,red-gate SQL Developer Bundle,它可以处理比较,并允许连接到版本控制系统。根据您的要求,您拥有 idera SQL 比较工具集,但不应忽视 idera 对所有事物的完美主义方法。

    无论如何,在我看来,管理变更不能也不应该被视为一项技术性的事情,它必须成为 IT 治理和程序的一部分,它需要在任何相关职能部门之间进行记录和沟通。

    当一些小版本、热修复、微更改或类似的事情发生时,它们必须反映在需要获得它的所有其他环境中。

    当然,如果生产环境中有一个迷你版本并且您是 UAT 的中间人,那么您可能不想在该环境中插入该迷你版本。 IMO,在 UAT 之后不久,您应该将 mini-release 应用到环境并执行 E2E QA 会话,以确保环境良好。

    如果您阅读我的上一段您可能会发现一些问题,比如说 UAT 有一个 SP 版本 4,而迷你版本相同的 SP 是 2...您如何确保您不会导致回归?

    这时版本控制系统和合并工具就派上用场了。 Red Gate 工具还可以帮助您构建部署。

    但是,我相信治理、沟通和遵守规则是持续成功的最重要因素。

    当今的趋势是实施持续集成,并按需构建测试环境,包括内部、托管和云端。通常它们的建造和维护并不便宜,但它们有回报!

    最后但并非最不重要的一点是,在为 SQL 部署进行开发时应遵守的一些相同规则:

    1. 每个更改脚本都应该是可重复的,例如
      • 创建过程前检查是否存在,创建前删除
      • 在任何插入之前检查该行不存在,然后插入其他更新
    2. 部署到多个数据库时,每个更改脚本都必须确保您使用正确的数据库(在这里我发现同义词是自开罐器创建以来最好的发明之一)
    3. 更改脚本应遵循顺序。对于每个对象:
      • DDL
      • 为上述 DDL 应用 DCL
      • 为表格应用 DML。
    4. 我发现脚本的最佳顺序是
      • 创建/更改表
      • 创建/更改视图
      • 刷新所有视图
      • 创建/更改函数
      • 创建/更改函数
      • 执行每个 DML。
    5. 在每个脚本中,避免失败按 ABC 对脚本的子部分进行排序,通常您有 FK 或 SP 等执行其他 SP 的依赖项,这使 ABC 方法令人沮丧。

    【讨论】:

    • 感谢@Luis 的详细解释;我认为这一定是我的错误解释,我无法正确回答我的问题。我已经在我的部署脚本中遵循了一个序列,如果与您布置的不同,它也是相似的。但我的主要问题或需要是以编程方式找出所有更改对象,而不是手动计算更改的内容。但是我完全同意你在序列部分。
    • @RobertDinaro 看看Red Gate development bundle,他们有处理版本控制和比较以及部署脚本的工具。他们很可能可以处理以编程方式找出所有更改的对象部分
    • 谢谢@Luis - 这是为一家不想花钱的公司工作变得更加痛苦的地方:) 但感谢您的帮助。非常感谢。
    • @RobertDinaro,我过去也遇到过类似的情况。让老板明白,让开发人员浪费时间重新发明轮子(并且在调试过程中发明一些没有人想到的错误)会花费公司很多钱。 nb 1。我看到你在 LDN,也许它可以通过提高自豪感告诉他们 RedGate 是英国人来帮助说服他们? nb 2:我听说过 this codeplex 我从未尝试过,也不知道有谁这样做过,但您可以尝试告诉我。
    【解决方案2】:

    我知道来晚了,但试试redgate 工具,这是最好的控制数据库对象的来源和同步的工具。我一直在使用这个工具,并且对结果深信不疑。有许多选项可以将您的 SQL 脚本、用户、安全性、设置和特殊数据从一个数据库同步到另一个数据库。

    【讨论】:

      猜你喜欢
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多