簡體   English   中英

如何識別 SAP ASE 16.0 中的行是否發生更改

[英]How to identify if row changed in SAP ASE 16.0

我有一個 SAP ASE 16.0 SP02 PL06,想知道該行的數據是否發生了變化。

我用例是,我有一個表中的數據和相同的表中的所有行的所有先前的狀態(這是“數據進化”的歷史,如果你喜歡),再加上一些審計列( rowIDhistorizationDate )。 我需要知道給定行的最后一個歷史版本和當前版本是否不同。

首先,我對HASH()函數感到欣喜若狂,直到我發現它只需要單個數據,例如一個單元格、常量或這些的組合。 然后我的想法轉向了丑陋和骯臟的黑客:連接給定行的所有列並直接比較它們(這會導致很多convert(varchar, column) ,但沒有散列)。

對於下面給出的約束,是否有更好的解決方案?

約束:我不能改變原始表,解決方案必須盡可能快(通過表的高吞吐量,高並發,實際上是整個數據庫的核心)並且源表有一個 4 列的主鍵和高 10's列總數。 不存在需要散列的敏感數據(如密碼)。

表格結構大大簡化:

原來的:

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 歲,成熟得很好。)

所有這些歷史數據的最終用途是查看在任何給定時刻數據庫中存在哪些數據,以從中得出一些業務結論(例如,這些數據多久更改或更改多少,如果遵守操作程序和類似用途) )。

首先,我對 HASH() 函數感到欣喜若狂,直到我發現它只需要單個數據,例如一個單元格、常量或這些的組合。 然后我的想法轉移到丑陋和骯臟的黑客:連接給定行的所有列並直接比較它們

SAP ASE 也有一個hashbytes()函數,可以執行如下操作:

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

請注意,在某些版本的 ASE 16 中,將 'md5' 與 hashbytes() 一起使用會導致嚴重的內存泄漏。 列列表不能使用“*”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM