2016-01-13 99 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.向每个修订版添加用户名信息。