【发布时间】:2016-04-18 10:55:03
【问题描述】:
我有一个用户必须登录的 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 ;
正如您从上面的触发器中看到的那样,每当在 Book 表上完成插入操作时,我都会将一条新记录插入到 audit_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 中运行,在应用程序上下文之外(保存应用程序用户状态等重要信息)——这就是为什么它们通常不适合生成审计日志的原因。最好在应用程序本身内执行审计(如果需要,仍保存到数据库中),为此已经存在许多工具。
-
也就是说,我想您的应用程序可以在每个会话开始时设置 MySQL user variable,然后在您的触发器中访问它......但这很有可能出错(如果会话被丢弃(例如由于超时或网络错误)并在不重新建立用户变量状态的情况下自动重新连接会发生什么?)。
标签: java mysql database hibernate