【问题标题】:Order by creation time in OpenEdge在 OpenEdge 中按创建时间排序
【发布时间】:2014-09-03 14:25:18
【问题描述】:

是否有一种自动方法可以知道哪些行是最新添加到 OpenEdge 表中的?我正在与客户合作并可以访问他们的数据库,但他们没有保存数据的 ID 或时间戳。

我想知道,OpenEdge 是否能够以某种方式开箱即用地做到这一点。 (我怀疑它是,但检查不会有什么坏处)

编辑:我的目标

我的目标是能够只导入特定表的新数据,即增量。如果没有哪些行是新的,我不得不导入所有内容,因为我不知道添加了什么。

【问题讨论】:

  • 我认为按 ROWID() 排序会有所帮助。我不确定它有多独特:(
  • 不,按 ROWID 排序无济于事。可以在任何地方插入行,并且可以重复使用 ROWID。
  • 为什么你认为你想知道什么记录是“最新的”?了解原因可能会指向不同且可能更好的解决方案。
  • @TomBascom 我希望能够轮询新数据。我只是想看看是否可以在不要求客户插入有用的元数据(如时间戳)的情况下实现它。显然,如果我不能,那么我需要与他们交谈。
  • 如果您提供有关表格及其内容、更新频率等的更多信息,也许有人可以帮助您。可能还有其他可用的数据源,例如,如果数据库有一个 Web 前端,那么您很可能拥有可以处理的访问日志?

标签: database openedge progress-db


【解决方案1】:

1) 简短的回答是否定的 - 没有“在框中”的方式让您知道添加了哪些记录或添加的顺序。

判断创建顺序的唯一方法是应用序列或对记录加时间戳。由于您的应用程序两者都没有,因此您不走运。

2) 如果您正在寻找不应用架构更改的更改,您可以使用会话或数据库触发器捕获更改以捕获对数据库的更新,并将该活动日志保存在某处。

3) 如果您只是在寻找“增量” - 您可以定期备份数据库,然后使用查询将当前数据库与备份数据库进行比较,并通过这种方式获得差异。

4) 在客户站点上维护一个数据库,其中包含最后一个表转储的内容。下次您想从客户那里获取增量时,将该表的内容与当前表进行比较,转储差异,然后更新 db 表以匹配当前 db 的表。

5) 个人。我会与客户交谈,看看 (a) 他们是否真的需要此功能,(b) 了解他们对向系统添加一些字段和一些代码以获取活动日志的想法。添加一些字段和一些代码来更新它们应该不是什么大问题。

【讨论】:

  • 嘿@Tim,看看我对原始问题的最后评论。
  • “使用查询将当前数据库与备份数据库进行比较,并以这种方式获取差异”。你在这里是什么意思?如何在没有实际顺序检查整个事情的情况下将整个表与其备份进行比较?这不会破坏我的小项目的目的吗?我更新了我的问题,解释了为什么我想要这个功能的真正目的。
  • 我将 #4 更改为 #5 并添加了一个新的 #4 来解决您正在做的事情。
  • 没有事件捕获机制,没有办法避免对两个表进行表扫描以获得他想要的。如果他每周只做一次,那么“效率”不足就不是问题了。
  • 感谢您的全面回答@TimKuehn。
【解决方案2】:

您可以使用数据库触发器来满足这一需求。为此,您需要能够编写和部署触发器过程。您需要记住,4GL 和 SQL-92 引擎不能识别彼此的触发器。因此,如果可以通过 SQL 进行更新,4GL 触发器将对这些更新视而不见。反之亦然。 (如果您不使用 SQL,这些都无关紧要。)

您可能希望使用 WRITE 触发器来捕获数据的插入和更新。你关心删除吗?

简单的 4gl WRITE 触发器:

TRIGGER PROCEDURE FOR WRITE OF Customer. /* OLD BUFFER oldCustomer. */  /* OLD BUFFER is optional and not needed in this use case ... */

  output to "customer.dat" append.

  export customer.

  output close.

  return.

end.

【讨论】:

  • 这是我的选项列表中的第二个... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
相关资源
最近更新 更多