2013-03-20 82 views
7

我在生產環境中使用基於Hibernate的應用程序,並使用大型數據庫。我需要在這個應用程序中向兩個實體(兩個表)添加審計,並且我決定和Envers一起去。將Envers添加到現有數據庫

對於每個INSERT,UPDATE或DELETE,Envers都將一條新記錄添加到實體的審計表中。

如果我從應用程序的啓動獲得Envers支持,那麼在實體創建(插入)時將會填充審計表。

Envers文檔非常薄,並沒有提到有關將Envers添加到現有應用程序的任何內容。

如果我只是添加Envers支持並創建相應的審計表,它們將開始爲空,所以當我更新現有實體時,Envers會向審計表添加一條記錄以記錄新值,但是我將失去以前的值。

如何將Envers支持添加到具有現有數據庫的應用程序中?

+0

嗨!你解決了你的問題嗎?我也有同樣的問題。 – gipinani 2013-08-30 05:22:58

+0

不,我給Envers並使用ON INSERT和ON UPDATE數據庫觸發器 – 2013-08-30 13:42:53

回答

2

目前沒有內置解決方案。

「正確」的方法是爲每個現有實體編寫一個SQL腳本(或手動創建)「0」版本以及與該版本綁定的插入審計記錄。

其實,這是一個非常普遍的要求,所以如果你想貢獻,這將是最受歡迎的!

+0

因爲修訂是全局的,而不是特定實體的本地,恐怕添加一個「0」影響所有實體的修訂版會打破以前的修訂版的查詢,因爲當我查詢「0」修訂版時,它會嘗試加載整個數據庫,這不是問題嗎? – 2013-03-21 16:36:20

+0

@DanielSerodio Adamw是正確的。您必須添加修訂版本0並從現有數據庫開始。如果目前沒有審計,你如何能找出以前的修訂版? – RNJ 2013-03-21 16:38:19

+0

@RNJ,因爲您在我上面的評論後迅速回復,我不確定您是否看到該評論(關於全局修訂)。你認爲這會是一個問題嗎? – 2013-03-21 16:40:08

1

您將需要手動插入。像

INSERT INTO z_envers_revisions (ID, timestamp, user_id, user_name) values (1, round((sysdate - to_date('19700101','YYYYMMDD')) * 86400000) , 42, 'UserName'); 

INSERT INTO z_Table1(rev, revtype, id, description, name) select 1 as rev, 0 as revtype, id, description, name from Table1; 
INSERT INTO z_Table2(rev, revtype, id, description, name) select 1 as rev, 0 as revtype, id, description, name from Table2; 

我已經前綴AZ我在這裏的審計表的東西把它縮短

0

至於envers而言,基本用例是記錄一個實體的完整的審計(參數我們希望通過@Audited註釋)。對於您提到的情況,可能會正確添加新實體,但對於現有的實體可能會帶來問題,因爲審計表中沒有修訂。

讓我們破案有場景的幫助:

比方說,我們已經考慮到實體用戶。現在創建的表格用於觀察歷史記錄,比方說,users_audit。除此之外,revinfo也將適用於觀察和記錄對於給定記錄的所有變化。

問題首先出現,因爲每當有更新時,持久層無法找到修訂記錄。因此,爲了解決這個問題,需要在表中存在所有現有的條目,並且不應該使用revinfo表進行外鍵映射。因此,需要兩件事情要做:

  1. 插入Temp值在revinfo表,以便轉可以作爲外鍵
  2. 複製從用戶行爲數據表到users_audit表。

樣品Liquibase文件可以是這樣的:

CREATE TABLE `revinfo` (
     `rev` int(11) NOT NULL AUTO_INCREMENT, 
     `revtstmp` bigint(20) DEFAULT NULL, 
     PRIMARY KEY (`rev`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

    INSERT INTO `revinfo` (`revtstmp`) select updated_at from users u; 

    SET @position := 0; 

    insert into users_audit (
    rev, 
    revtype, 
    id, 
    name, 
    type, 
    mobile_number, 
    password, 
    parent_id, 
    profile_image_uri, 
    is_active, 
    created_at, 
    updated_at 
    ) select @position := @position +1, 0, 
    id, 
    name, 
    type, 
    mobile_number, 
    password, 
    parent_id, 
    profile_image_uri, 
    is_active, 
    created_at, 
    updated_at from us 
相關問題