2016-01-13 134 views
1

我有一個用戶必須登錄的Web應用程序。我正在使用Hibernate將對象保存到MySQL數據庫。在數據庫中,我有當過插入/更新/刪除的對象將用戶名添加到審計表

DELIMITER $$ 
CREATE TRIGGER `trg_insert_Book` BEFORE INSERT ON Book FOR EACH ROW 
    BEGIN 
     INSERT INTO audit_book (AUDITTYPE,AUDITDATE,bookId, bookName, pages) VALUES ('I',NOW(), NEW.bookId, NEW.bookName, NEW.pages); 
    END; $$ 
DELIMITER ; 

上完成你可以從觸發見上面,我是插入新記錄到audit_book其中新記錄插入到審計表觸發器表在Book表上完成插入時。該插件使用下面的代碼完成

public void addNewBook(Book book) { 
    Session session = sessionFactory.getCurrentSession(); 
    session.save(book); 
} 

我有一個返回當前使用該系統的用戶的方法

@ModelAttribute("username") 
    public String getPerson(Principal principal) { 
    return principal.getName(); 
} 

我的問題是如何將這些用戶名傳遞到數據庫中,以便用戶名被添加到審計表中,而無需將用戶名添加到Book對象?

+0

總之,你不能。觸發器在RDBMS中運行,在應用程序上下文之外(其中保存了應用程序用戶狀態等重要信息) - 這就是爲什麼它們通常不適合生成審計日誌。更好的是在應用程序本身內執行審覈(如果需要,仍然保存到數據庫中),對於這些工具已經存在許多工具。 – eggyal

+0

也就是說,我想你的應用程序可以在每個會話開始時設置一個MySQL [用戶變量](https://dev.mysql.com/doc/en/user-variables.html),然後在你的觸發器......但有很大的潛力出錯(如果會話被丟棄(例如由於超時或網絡錯誤),並自動重新連接而不重新建立用戶變量狀態會發生什麼?)。 – eggyal

回答

2

不,你不能那樣做,因爲數據庫不知道識別應用程序用戶的邏輯。

您可以考慮使用Hibernate Envers代替數據庫觸發器進行審計。在鏈接的示例中,您可以在部分看到如何實現您的目標。4.向每個修訂版添加用戶名信息。