我有一些我想爲其版本數據的表。就設計而言,這些只是插入表格。該表是這樣的使用Oracle進行數據版本管理
TABLENAME
----------
SURROGATE_KEY_ID
USER_VISIBLE_NATURAL_KEY_ID
VERSION
VALUE
我要的是每當我插入一條記錄,新的記錄應該有一個版本比以前的版本最大爲給定USER_VISIBLE_NATURAL_KEY_ID一套更大的。我對版本的期望是能夠從舊數據中分辨新數據,同時保留舊數據。你知道,標準的歷史追蹤,審計還是有些東西。
我試着像
CREATE OR REPLACE TRIGGER TABLENAME_TRIGGER
BEFORE INSERT ON TABLENAME
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
LATEST VERSION NUMBER;
BEGIN
SELECT NVL(MAX(VERSION), 0) INTO LATEST_VERSION FROM TABLENAME
WHERE TABLE_NAME.USER_VISIBLE_NATURAL_KEY_ID = :NEW.USER_VISIBLE_NATURAL_KEY_ID;
:NEW.VERSION = LATEST_VERSION +1;
END;
觸發這給了我一個變異表的錯誤,我想是因爲我想偷窺TABLENAME找到MAX(版本),而插入新行。
我該如何使這種方法奏效,或者如果我完全錯了頭,有什麼更好的方法?
怎麼樣一個獨立的序列自動填充'VERSION'列? 「VERSION」列將提供「USER_VISIBLE_NATURAL_KEY_ID」的排序,而不管間隙。即爲什麼'VERSION'必須是下一個價值而不是簡單的價值? – Glenn
這是一個有趣的想法。你會如何建議處理序列翻轉?注意它何時發生並在此之前存檔舊數據? – monknomo
如果有人擔心翻車,我通常會根據日期和順序創建一個由2部分組成的標識符。然後按ID,時間戳,seq排序。將日期/時間戳設置爲適當的粒度,並且不需要擔心順序翻轉。 – Glenn