问题标签 [database-versioning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
492 浏览

c# - 在 Oracle / SqlServer 和 SqlLite 上进行数据库迁移的解决方案

我正在寻找一种可以在 TFS 内进行数据库迁移和版本控制的工具(最好是开源的),并且能够在部署/构建期间自动部署它。

背景

我们开发了一个经常更新的应用程序,有时会更改数据库,有时不会更改。该数据库在 Oracle 11g 上运行,还有一个 Sqlite 数据库可以运行测试。我们将 NHibernate 与 Fluent-NHibernate 结合使用作为 ORM(Fluent-NHibernate 用于映射)。

现在的情况

此时数据库更改是手动完成的。更改用于创建数据库的流畅映射并编写 SQL 脚本来更改/删除/创建我们需要的任何内容。要进入测试/验收/生产,我们针对不同的配置进行构建,然后将内容复制到特定服务器并在数据库上运行特定的 SQL 脚本。

缺点

NHibernate 的 schemaupdate 不允许破坏性更新,因此如果我们正在寻找 NHibernate 解决方案,则必须手动完成。

首选情况

以上是一个可行的解决方案,但现在我们需要对这些更改进行版本化,以便我们可以在使用Expand/Contract部署新版本时向上/回滚(如果需要)。当我们将新版本部署到数据库时,最好自动完成。

问题

  1. 是否有使用 Expand 和 Contract 生成架构的迁移工具
  2. 它是否适用于 Oracle 11g、SqlLite 和 SqlServer
  3. 可以继续使用 NHibernate / Fluent-NHibernate
  4. 自动部署特定构建的好方法(不是必须的,有足够的工具来做到这一点,但也许有一些可以做所有事情的好方法)

被调查

我希望这很清楚,如果不能随意发表评论

0 投票
2 回答
5045 浏览

mysql - 基本的mysql版本控制?

我们有一个如下图所示的购物车,该设置运行良好,除了一个致命缺陷。如果您下订单,则订单与产品相关联,因此如果我在您购买产品后更新产品,我无法向您展示您想要产品在您购买时的样子(包括价格)。这意味着我们需要版本控制。

当前架构

我目前的计划是,当创建新产品或变体或编辑现有产品时,在数据库中创建产品或变体的副本。购买时,将订单链接到版本,而不是产品。

这看起来相当简单,除了我可以看到我们唯一不需要版本化的是类别(因为没有人关心它属于什么类别。)。所以我们需要版本:

  • 产品
  • 变体
  • 每个版本的键 -> 值对属性
  • 图片

我目前的想法是,

注意: 当创建产品时,也会创建默认变体,这不能被删除。

  • 创建产品时
    • 将产品插入产品表中。
    • 创建默认变体
    • 将产品复制到 products_versions 表中
      • 用 product_id 列替换当前 id 列
      • 添加标识列
    • 将变体复制到 variables_versions 表中
      • 用 variant_id 列替换当前 id 列
      • 添加标识列
      • 将 product_id 列替换为 product_version_id 列

  • 编辑产品时
    • 将产品更新到产品表中。
    • 将产品复制到 products_versions 表中
      • 用 product_id 列替换当前 id 列
      • 添加标识列
    • 将所有产品变体复制到 variables_versions 表中
      • 用 variant_id 列替换当前 id 列
      • 添加标识列
      • 将 product_id 列替换为 product_version_id 列
    • 将所有 variant_image_links 复制到 variant_Image_link_version 表中
      • 将当前的 variant_id 列替换为 variant_version_id 列

  • 添加变体时
    • 将变体添加到变体表中。
    • 将产品复制到 products_versions 表中
      • 用 product_id 列替换当前 id 列
      • 添加标识列
    • 将所有产品变体复制到 variables_versions 表中
      • 用 variant_id 列替换当前 id 列
      • 添加标识列
      • 将 product_id 列替换为 product_version_id 列

  • 编辑变体时
    • 更新变体表中的变体。
    • 将产品复制到 products_versions 表中
      • 用 product_id 列替换当前 id 列
      • 添加标识列
    • 将所有产品变体复制到 variables_versions 表中
      • 用 variant_id 列替换当前 id 列
      • 添加标识列
      • 将 product_id 列替换为 product_version_id 列
    • 将所有 variant_image_links 复制到 variant_Image_link_version 表中
      • 将当前的 variant_id 列替换为 variant_version_id 列

所以最终的结构看起来像Full Size

现在这一切看起来都很棒,除了看起来有很多重复的数据,例如,如果我们更新产品,我们会复制变体,即使它们在插入后不会更新。此外,这似乎需要做很多工作。

有没有更好的方法来做到这一点?

0 投票
2 回答
1047 浏览

mysql - 获取mysql行版本号?

我有一个数据库,其中所有内容都使用start_dateend_date

我想要做的是动态获取一行的版本号。

因此,获取按 start_date 排序的具有特定 item_id 的所有行,然后给出 astart_date并将end_date其隔离为一行。我想要的是找出那一排的位置。

例如数据

如果使用select id from items where item_id = 2 and start_date = 05-31-2012

会返回5,所以我想要的版本是2

如果使用select id from items where item_id = 1 and start_date = 03-31-2012

会返回4,所以我想要的版本是3

我能想到的唯一方法是选择所有带有 item_id 的行,然后遍历每个项目检查 start_date,如果它不是我想要的,将 version_number 增加 1。

有没有办法只用mysql?

0 投票
2 回答
14077 浏览

database - 从不就地删除或更新数据的通用数据库

深受 Rich Hickey 倡导的数据管理方法的启发,并在Datomic中实现,其中数据永远不会就地发生变异,所有版本始终保留且可查询,时间是第一类概念。

当然,也有与该描述相匹配的专门数据库,例如 Git 或任何其他源代码控制系统。问题是是否有任何(或多或少)通用的关系、图形、分层、文档或任何其他风格的 DBMS-es 可以有效地用于电子商务 Web 应用程序等。还是 Datomic 是唯一的选择?

0 投票
1 回答
179 浏览

zend-framework - 从 Zend_Db_Adapter::exec() 获取错误消息

我正在编写一个脚本来简化我们的数据库版本控制。为了做到这一点,我们有许多文件(每个文件至少包含一个语句,有几个有超过一百个)包含我们需要更新使用分号分隔的模式的 SQL 查询。它在 90% 的时间里都能正常工作,只是偶尔其中一个语句会失败,而且我们在修复这些问题时遇到了问题。发生这种情况时,我们必须删除数据库并手动将每个 SQL 语句复制并粘贴到失败的文件中以对其进行测试。某些查询会导致异常,但对于某些查询,该函数仅返回 1。

我正在使用以下代码,但我不知道如何找到有问题的语句:

0 投票
1 回答
191 浏览

mysql - MySQL 确定性迁移脚本

我目前正在寻找一种方法让我的数据库处于版本控制之下。为此,我希望拥有只能运行一次的确定性过程(具有相应的撤消)。

我在构建第一个充满小错误的脚本时遇到问题。

以下是 3 个主要部分:

执行查询的条件(如果字段不存在)

表改:

最后是数据迁移

我正在尝试以这种形式进行这项工作:

我得到的当前错误:

谁能指出我解决这个问题的正确方向?

顺便说一句,我正在使用5.5.16-log - MySQL Community Server.

0 投票
1 回答
146 浏览

ios - 应用程序更新之间的 CoreData,表示默认数据刷新

在处理 CoreData 时,我遇到了一些问题,我试图将其扼杀在萌芽状态,以便将来对系统进行校对。一个简单的事实是,我以前从未做过这样的事情(即使用 CoreData)。虽然我已经设法弄清楚如何在应用程序中使用它,但我需要知道一种体面的做法来指示应用程序在首次应用程序启动时需要刷新默认数据的版本之间。

所以现在,在我的 AppDelegate 中,我设置了我的托管对象上下文,并执行了一个获取请求以查看特定表/实体中是否有任何记录。我只希望在首次启动时发生这种情况,所以我不会在每次应用程序启动时不断重写数据库的内容。无论如何,所以它继续使用对象模型来处理在有问题的实体之间插入数据(有一些)

现在,对于这个版本的应用程序,它会在没有 API 的情况下进入商店(这是一个遥远的未来),但在发布到应用商店的版本之间,我们可能必须更新实体中的特定信息(例如:价格) ,我只希望在应用启动时进行此刷新。此外,架构可能会更改,我不确定是否或何时更改,但我想确保这可以适应这种情况以防万一。

我想,对coredata“添加模型版本”进行版本控制就可以了,将新的数据库版本设置为活动版本,但是当我在模拟器中启动应用程序时,没有任何反应告诉我里面的数据被保留了。

对我应该做些什么来适应这一点的任何帮助将不胜感激。谢谢!

0 投票
1 回答
2151 浏览

visual-studio - 是否有适用于数据库专业人员的最新版本的 Visual Studio Team Edition?

我刚刚查看了一些关于数据库版本控制的文章,并偶然发现了 Jeff Atwood 的博客,他在该博客中推荐了 Visual Studio Team Edition for Database Professionals。他提供了一个试验链接,但唯一的问题是该试验是从 2005 年开始的。

该产品完全是 Visual Studio 的单独版本,还是某种加载项?无论哪种情况,是否有最新版本?当我用谷歌搜索时,我没有看到 2012 年的任何内容。

0 投票
3 回答
245 浏览

c# - 在运行数据库的版本控制脚本时管理对象的依赖关系

我们将我们的数据库置于版本控制之下。我们有大约 2400 个对象,其中大部分是存储过程。

因此,如果不存在,我们已经为除表之外的所有对象创建脚本。

我们在存储增量脚本的单独文件夹中维护表脚本。只有增量脚本被编号。其他与程序、视图和功能相关的脚本将直接运行。

因此,当开发人员在 svn 中提交更改时,我们希望在暂存版本上运行它们。问题是对象的依赖性。

如果开发人员在一次提交中提交了多个脚本,这些脚本可能相互依赖,或者如果我们想合并多个修订版然后组合运行脚本,那么我们无法确定运行脚本的正确顺序。

任何人都可以提出一些管理依赖项并帮助我们确保脚本首次运行的好方法。

我们不能在这么多的生产服务器中使用 redgate 工具,所以除了使用 sql compare 或 sql sourcecontrol,我将不胜感激。

我们总是首先运行 table delta 脚本,因为它们不依赖于其他对象(开发人员也会在脚本中管理它),然后是其他对象

我们已经为运行其他对象的顺序提供了一些解决方法,例如

1)我们可以将对象的依赖关系存储在另一个具有相同名称但扩展名不同的文件中,这样如果依赖关系发生变化,则开发人员应该使用脚本提交它。然后我们可以制作一棵树,根据它我们可以运行脚本。

2)我们可以先创建一个树然后在svn中提交它,如果依赖关系发生变化,然后我们可以在登台机器上测试脚本并发生错误后将它添加到树中。(这需要在第一次失败后提交svn并要求自动化过程第一次失败)

3)我们可以一次又一次地运行脚本,而无需使用事务的最大次数和对象的数量一样。假设最坏的情况,这将导致最终正确运行所有脚本。

如果您有其他想法或可以改进其中一些想法,请贡献。

0 投票
1 回答
233 浏览

sql-server - 仅提交 SQL 源代码控制中的部分更改

我目前正在测试 RedGate 的 Sql Source Control(版本 3.1.3.26)。

我有一个包含静态数据的表,它在每一行中存储一个 SQL 语句。
有没有办法只提交部分更改?
例如,我更改了 5 行,但我只想选择其中的 3 行进行提交。

我正在考虑一种类似于 RedGate 的数据比较提供的功能,我可以在其中单独决定每一行是否应该包含在部署脚本中。

这是可能的还是我只能提交表的完整更改?