问题标签 [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 投票
1 回答
119 浏览

node.js - 带有版本化数据和差分端点的 REST API:优化带宽和性能

我的 NodeJS 项目基于 SailsJS,它本身使用 ExpressJS。

它的 API 将被移动应用程序用来从中获取数据。

棘手的部分是我不希望客户端应用程序在每次数据库发生更改时都获取整个数据树。

客户端只需要下载它已经获得的数据和服务器上的数据之间的差异。

为了实现这一点,我想到了在服务器上使用 git。那就是创建一个存储库并将所有端点保存为存储库中的 json 文件。每次保存都会触发自动提交。

然后我可以创建一个特定的 API 端点,它将接受提交 sha 作为参数并返回它与 git HEAD 之间的差异。

William Benton 的这篇文章用这个想法安慰了我。

我现在正在寻找任何可以帮助我根据上面引用的语言和框架完成这项工作的技巧:

  • 我想看到这个概念的证明,但找不到
  • 我还没有找到一种简单的方法来使用 git 和 NodeJS。
  • 我不确定如何解析使用 IONIC 框架开发的客户端应用程序返回的差异,因此 AngularJS。

注意:该 api 将只可读。所有数据库移动都将由少数用户使用的自定义 Web 后端触发。

0 投票
0 回答
226 浏览

oracle11g - 数据修订/版本控制最佳实践

我正在努力定义一个有效的修订过程。我们有一些数据分布在多个表中。我们不能删除或更新,我们需要创建相同数据的新问题。我知道包含所有修订等的历史表的解决方案,但只要您想保留简单结构的修订,例如博客平台,这似乎工作正常。

如果您有一个具有许多复杂结构的数据库,其中最简单的结构如下所示。

有关系的简单表

如果您更改 tableA 中的某些内容,您可以将旧数据保留在历史表中。但是,如果您更改 TableB 中的某些内容,它定义了 TableA 中的记录是什么,会发生什么?它几乎迫使您创建 TableA 的副本(换句话说,新 ID)并重新创建它的底层结构(更多新 ID)。每次更正错误或添加一些外围数据时创建新ID的整个过程,感觉不太好。

这种情况有什么好的做法吗?我在某处读到了有关在 XML 中修改整个旧数据结构的文章,但这种做法可能不愿意改变模式,而且不容易查询。Flashback 等技术也无法满足我们的全部需求。

提示:我们使用的是 Oracle v11.2。

0 投票
2 回答
142 浏览

git - 如何将 Git 存储库的版本与另一个 Git 存储库的版本链接

我有两个 Git 存储库,一个用于我的应用程序的版本控制,另一个用于 DB 模式的版本控制。

我想使用一个持续集成和部署系统,所以我需要将应用程序的每个版本与相应版本的 DB schema 链接起来,以便 CI 系统可以拉出正确的应用程序和 DB 版本并进行部署。

有什么办法可以用 Git 做这件事吗?

谢谢

0 投票
0 回答
813 浏览

sql - 如何使用 Liquibase SQL 语法忽略字符串中的拆分字符

我有这个 SQL 脚本:

此脚本由 Liquibase 执行,但会引发此错误

...

引起:java.sql.SQLSyntaxErrorException:ORA-01756:引用的字符串未正确终止

...

问题是 Liquibase 在找到 ';' 时会拆分第二个插入语句 在DB_EXECUTION.COMMAND字段的引用字符串中;事实上,Liquibase 不会将 SQL 语句解释为 SQL,而是将它们视为普通字符串。

这是一个问题,因为我必须以某种方式拆分语句,因为我在同一个脚本中有多个插入语句(所以splitStatements选项对我来说不是一个选项)同时我必须告诉 Liquibase 将 SQL 字符串视为开始和以单引号结尾。

有没有办法解决这个问题?

谢谢

朱利奥

0 投票
1 回答
645 浏览

fluent-migrator - FluentMigrator - 如何更改表权限?

我已经开始使用 FluentMigrator 作为我的 MSSQL 数据库的数据库迁移工具。它似乎满足了我在 CRUD 表操作和播种方面的大部分需求。

但是,在创建表后,我根本找不到配置表权限的方法。

我知道我可以简单地使用 GRANT PUBLIC SELECT ON BLAH 语句运行 .sql,但我真的很想改用 fluent api。

您知道使用 fluent api 更改权限的方法吗?

0 投票
1 回答
416 浏览

sql-server - RoundhouseE(数据库迁移实用程序)是否支持在 SQLCMD 模式下运行 SQL Server 脚本?

如果这个超级 RoundhouseE 数据库迁移工具支持 SQLCMD 模式下的 SQL Server 脚本,那就太棒了。Visual Studio 数据工具在 SQLCMD 模式下生成脚本。最好将这些 SQLCMD 模式脚本添加到 RoundHouse 迁移中而不做任何修改。

0 投票
2 回答
118 浏览

sql - 实际/历史表:按版本号选择

我在 PostgresSQL 数据库中有两个数据库表:

当记录发生更改时,它会被复制到历史记录表中,并且实际版本会增加。无法删除行。

例如,如果我们有 3 条记录A1, B1, C1(1 是版本号)并更改 B 的名称,那么实际表将包含A1, B2, C1和历史 - B1。然后我们可以更改 C 的名称,实际数据将是A1, B2, C3和历史 -B1, C1

如何按名称和版本号选择行?例如version = 2 and name like '%'应该给我们A1, B2, C1(A1 和 C1 在版本 2 上仍然是实际的,它们与版本 1 相比没有变化)。

我想出了一个工会选择,例如:

是否可以在没有联合(即 Hibernate 不支持它)或使用一些更优化的方式的情况下做到这一点?

0 投票
1 回答
396 浏览

sql-server - 带有迁移的 VCS 中的数据库

我有一个数据库(SQL Server 2008 R2),它主要受源代码控制(因此每个数据库对象一个文件,在文件夹中组合在一起,例如表、视图、存储过程)。目前,更改是通过编写 SQL 升级脚本进行的,然后是一些自制批处理文件来执行它们(它们也很容易出错)。

因此,我们正在研究迁移是否对我们有用,但我还没有看到对最佳实践的很好解释。大多数博客文章似乎都假设一个空数据库,然后进行几次迁移(通常是 CreateUsers 和 CreateRoles),但没有显示之后会发生什么?如果您有数百个存储过程,您是否希望它们(就像我们目前拥有的那样)在每个对象的 .sql 文件中,然后让您的迁移引用这些文件?我们是否混淆了基于状态的部署和基于迁移的部署?

换句话说,如果我们要进行迁移,我们是否应该有一个 SQL 文件来创建处于某个已知状态的整个数据库(快照 #1)(包含数百个表和数百个存储过程),编写一大堆在一个主要项目的过程中进行迁移,然后在该项目结束时,创建一个新快照,并将其添加到源代码控制中?所以我们的 VCS 中唯一的东西就是快照,以及在快照之间移动我们的迁移?但是,如果您没有单独的对象在版本控制之下,您如何跟踪例如用户表的历史?

0 投票
1 回答
109 浏览

mysql - 数据库版本控制使用哪个工具?liquibase vs mysql 二进制日志

我正在尝试构建一个重构、测试和部署我的数据库的过程。经过某种研究,我发现liquibase是管理我的数据库版本的好工具。类似的工作也可以只用mysql 二进制日志来完成。

你能告诉我 liquibase 在 mysql 二进制日志之上有什么好处吗?

0 投票
1 回答
1298 浏览

database-design - Database versioning without history tables

I was going through this post for record level versioning of tables. I noticed that the architecture deals with the usage of history tables. However, my scenario does not require rollback but retrieving point in time records. This is where I have tried with a design on using a single table for versioning. Note that this is a bare bone table data (no constraints, indices, etc.). I intend to index based on id since this involves group by clause on the column.

For example, I have got a table Test where

id is the identifier,

modstamp is the timestamp of the data (never null)

In addition to the columns above, the table will contain bookkeeping columns

local_modstamp is the timestamp at which the record was updated

del_modstamp is the timestamp at which the record was deleted

During backup, all the records are obtained from the source and inserted where the records would have the values local_modstamp = null and del_stamp = null.

Once the records are obtained, these are the scenarios for handling the data (assuming the reference time [ref_time] is the time at which the process is run):

  1. Insert as normal.

  2. Update: Update the most recent record with local_modstamp = ref_time. Then insert the new record. The query would be: update test set local_modstamp = where id = and local_modstamp is not null and del_modstamp is not null insert into test values(...)

  3. Delete: Update the most recent record with del_modstamp = ref_time. update test set del_modstamp = where id = and local_modstamp is not null and del_modstamp is not null

The design aims at getting the latest records where local_modstamp is not null and del_modstamp is not null. However, I ran into an issue where I intend to retrieve point in time using the query (inner-most query):

It seems that I have made a mistake (have I?) of using null as a placeholder to identify the latest records of the table. Is there a way to use the existing design to obtain the point in time records?

If not, I guess the probable solution is to set the local_modstamp to the latest records. This would require to update the logic using max(local_modstamp) in case of updates. Can I persist on my existing architecture to achieve in retrieving the point in time data?

I am using SQL-Server right now but this design may be extended to other database products too. I intend to use a more general approach to retrieve the data instead of using vendor specific hacks.