0

我正在尝试为我们的 OpenEdge 数据库中的表实施行版本策略。

我想出的简单解决方案是iRowVersion向每个表添加一个整数字段,并让写入触发器验证并递增该字段,如下所示:

TRIGGER PROCEDURE FOR WRITE OF Customer OLD BUFFER oldCustomer.

IF Customer.iRowVersion < oldCustomer.iRowVersion THEN
  RETURN ERROR "RowVersion Out Of Date".

ASSIGN Customer.iRowVersion = Customer.iRowVersion + 1.

这将防止任何并发更改被覆盖,但是我不确定每行增加一个是最好的。SQL ROWVERSION 在整个数据库中递增,并且为了模拟该方法将使用序列来代替:

ASSIGN Customer.iRowVersion = NEXT-VALUE(rowVersionSequence).

在我们的大型数据库中,许多记录将发生变化,这有可能非常迅速地增加序列。每张桌子有一个序列会减少这种情况,但似乎过头了,+1 的方法让它变得简单。

为了澄清这个问题 - 最好根据行上一个版本增加行版本号,还是应该采用类似 SQL 的方法 - 使每个行版本对数据库都是唯一的。

此外,如果沿着 SQL 风格路线走,创建触发器是否需要分配初始行版本?(否则所有新的未修改记录都初始化为 0)。

4

1 回答 1

0

对于 OpenEdge 数据库中的版本控制记录,我现在有一个应该可以很好地工作并且相当简单的解决方案。

每个需要有行版本的表都会有一个 Integer 类型的 RowVersion 字段。

我们有一个程序在创建新表时生成写触发器,因此更新它以添加一些新代码很简单。写触发器现在检查记录以查看表是否有 RowVersion 字段,如果有,则将版本增加 1。在更新之前检查以确保行版本匹配是程序员在他们的代码/脚本中的责任正在跑步。

这种方法有几个原因,但它使事情变得简单:

  1. 在运行查询和调试数据库时,整数简单易读。鉴于我们的应用程序使用情况,我们也不太可能溢出整数。

  2. 不需要序列来保持行版本的唯一性。他们不需要。每条记录只是增加自己的行版本。

  3. 虽然 ProDataSets 可以做乐观锁定,但不能保证使用中的记录总是会被这些读取/写入,因此一个字段让我们可以灵活地根据用途编写不同的代码。

  4. 通常应该在更新之前检查行版本,如果存在数据问题,则可能需要运行修复脚本来覆盖数据。为此,我们将检查留在调用过程(而不是触发器)中,以便对记录进行写操作。

于 2018-09-26T09:00:47.860 回答