【问题标题】:Adding username to audit table将用户名添加到审计表
【发布时间】: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


【解决方案1】:

不,你不能那样做,因为数据库不知道识别应用程序用户的逻辑。

您可以考虑使用Hibernate Envers 代替数据库触发器来进行审计。在链接的示例中,您可以在 4 部分中了解如何实现您的目标。将用户名信息添加到每个修订版

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2011-04-30
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2018-12-18
    相关资源
    最近更新 更多