我有一个SAP ASE 16.0 SP02 PL06,想知道该行的数据是否更改。
我的用例是,我有一个包含数据的表和具有所有行的所有先前状态的同一个表(如果需要,它是“数据演化”的历史记录)加上一些审核列({{1 }},rowID
)。而且我需要知道给定行的最新历史版本和当前版本是否不同。
首先,我对HASH()
函数大为欢喜,直到发现它仅接收单个数据,例如一个单元格,常数或它们的组合。然后,我的想法转向了丑陋和肮脏的hack:连接给定行的所有列并直接进行比较(这导致大量historizationDate
,但没有散列)。
关于给定的约束,是否有更好的解决方案?
约束:我无法更改原始表,解决方案必须尽可能合理地快(通过表的高吞吐量,高并发性,字面上是整个数据库的核心),并且源表具有4列主键且具有高整体上10´s的列。没有需要散列的敏感数据(例如密码)。
表的结构大大简化:
原文:
convert(varchar, column)
历史:
CREATE TABLE data (
dataID int,
column1 int,
column2 datetime,
...)
编辑:根据@markp的评论:该表不是由用户直接访问,而是通过存储过程访问。因此,当所有检查/准备工作完成后,数据将保存到表中。问题是毕竟检查新数据可以被拒绝。不是因为某些无效性/参照完整性/等等,而是因为数据源被认为不那么可靠,因此已经存在的数据。这种检查是通过几十个程序进行的,这些程序分别嵌套在几层深的几层深处,因此交替使用所有这些程序以查看它们是否/对数据做了什么不是一个很可行的解决方案...(是的,系统非常有用。大约20岁就很成熟。)
所有这些历史数据的最终用途是查看在任何给定时刻数据库中存在哪些数据,以从中得出一些业务结论(例如,如果遵循操作规程,则更改数据的频率或数量)和类似用途)。
答案 0 :(得分:0)
起初我对 HASH() 函数感到欣喜若狂,直到我发现它只需要一条数据,例如一个细胞,常数或这些的组合。然后我的想法转向了丑陋和肮脏的黑客:连接给定行的所有列并直接比较它们
SAP ASE 也有一个 hashbytes() 函数可以执行如下操作:
select hashbytes('sha1',col1,col2,col3) from mytable
请注意,在某些版本的 ASE 16 中,将 'md5' 与 hashbytes() 一起使用会导致严重的内存泄漏。列列表不能使用“*”。