将用户名添加到审计表
问题描述:
我有一个用户必须登录的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对象?
答
不,你不能那样做,因为数据库不知道识别应用程序用户的逻辑。
您可以考虑使用Hibernate Envers代替数据库触发器进行审计。在链接的示例中,您可以在部分看到如何实现您的目标。4.向每个修订版添加用户名信息。
总之,你不能。触发器在RDBMS中运行,在应用程序上下文之外(其中保存了应用程序用户状态等重要信息) - 这就是为什么它们通常不适合生成审计日志。更好的是在应用程序本身内执行审核(如果需要,仍然保存到数据库中),对于这些工具已经存在许多工具。 – eggyal
也就是说,我想你的应用程序可以在每个会话开始时设置一个MySQL [用户变量](https://dev.mysql.com/doc/en/user-variables.html),然后在你的触发器......但有很大的潜力出错(如果会话被丢弃(例如由于超时或网络错误),并自动重新连接而不重新建立用户变量状态会发生什么?)。 – eggyal