【问题标题】:How to identify if row changed in SAP ASE 16.0如何识别 SAP ASE 16.0 中的行是否更改
【发布时间】:2019-04-05 14:49:28
【问题描述】:

我有一个 SAP ASE 16.0 SP02 PL06,想知道该行的数据是否发生了变化。

我的用例是我有一个包含数据的表和同一个表,其中包含所有行的所有先前状态(如果您愿意,它是“数据演变”的历史)加上一些审计列(rowIDhistorizationDate)。而且我需要知道给定行的最后一个历史版本和当前版本是否不同。

首先我对HASH() 函数感到欣喜若狂,直到我发现它只需要一条数据,例如一个细胞,常数或这些细胞的组合。然后我的想法转向丑陋和肮脏的黑客:连接给定行的所有列并直接比较它们(这会导致很多convert(varchar, column),但没有散列)。

对于下面给出的约束,是否有更好的解决方案?

约束:我无法更改原始表,解决方案必须尽可能快(通过表的高吞吐量、高并发性,实际上是整个数据库的核心)并且源表具有 4 列主键和高总共 10 列。不存在需要散列的敏感数据(如密码)。

大大简化的表格结构:

原文:

CREATE TABLE data (
  dataID       int, 
  column1      int, 
  column2      datetime, 
  ...)

历史:

CREATE TABLE dataHistory (
  rowID              int         identity, 
  historizationDate  datetime    default getDate(), 
  dataID             int, 
  column1            int, 
  column2            datetime, 
  ...)

编辑:根据@markp 的评论:该表不是由用户直接访问,而是通过存储过程。因此,当所有检查/准备完成后,数据将保存到表中。问题是,毕竟检查新数据可能会被拒绝。不是因为某些无效性/参照完整性等,而是因为数据源被认为不如已经存在的数据可靠。这种检查是通过几十个程序完成的,这些程序嵌套了几层,并且分别针对每一列,因此交替所有这些程序以查看它们是否/它们对数据做了什么不是一个非常可行的解决方案......(是的,系统非常20岁左右成熟。)

所有这些历史数据的最终用途是查看在任何特定时刻数据库中存在哪些数据,以从中得出一些业务结论(例如,如果遵守操作程序,这些数据的更改频率或更改量)和类似用途)。

【问题讨论】:

  • 历史表是如何维护的?通过触发器?希望用户/应用程序确保在更新主表时更新它? [目标是了解您为什么要尝试查找“不同步”的行]
  • '问题是,毕竟检查新数据可以被拒绝。' - 主数据表或dataHistory中的数据是哪些新数据?
  • 可以拒绝主表中的新数据。表 dataHistory 只是任何给定时间主表的哑副本。而且我想通过检查是否发生更改来节省空间,所以我没有 n 次相同的行(除了审计列)。

标签: database sap sybase sap-ase


【解决方案1】:

首先我对 HASH() 函数感到欣喜若狂,直到我发现它只需要一条数据,例如一个细胞,常数或这些细胞的组合。然后我的想法转向丑陋和肮脏的黑客:连接给定行的所有列并直接比较它们

SAP ASE 也有一个 hashbytes() 函数,它可以做这样的事情:

select hashbytes('sha1',col1,col2,col3) from mytable

注意,在 ASE 16 的某些版本中,将“md5”与 hashbytes() 一起使用会导致严重的内存泄漏。列列表不能使用“*”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多