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對象?
總之,你不能。觸發器在RDBMS中運行,在應用程序上下文之外(其中保存了應用程序用戶狀態等重要信息) - 這就是爲什麼它們通常不適合生成審計日誌。更好的是在應用程序本身內執行審覈(如果需要,仍然保存到數據庫中),對於這些工具已經存在許多工具。 – eggyal
也就是說,我想你的應用程序可以在每個會話開始時設置一個MySQL [用戶變量](https://dev.mysql.com/doc/en/user-variables.html),然後在你的觸發器......但有很大的潛力出錯(如果會話被丟棄(例如由於超時或網絡錯誤),並自動重新連接而不重新建立用戶變量狀態會發生什麼?)。 – eggyal