首页 > 解决方案 > 如何识别 SAP ASE 16.0 中的行是否更改

问题描述

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

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

首先,我对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岁左右成熟。)

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

标签: databasesapsybasesap-ase

解决方案


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

SAP ASE 还具有一个hashbytes()函数,可以执行以下操作:

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

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


推荐阅读