【发布时间】:2017-06-13 08:53:09
【问题描述】:
总结(详情如下):
我想在使用 Spring/JPA 堆栈保存/更新/删除任何实体之前进行存储过程调用。
无聊的细节:
我们有一个 Oracle/JPA(Hibernate)/Spring MVC(带有 Spring Data repos)应用程序,该应用程序设置为使用触发器将某些表的历史记录到一组历史表中(我们要审计的每个表一个历史表)。这些实体中的每一个都有一个modifiedByUser,通过一个在更新或插入时扩展EmptyInterceptor 的类来设置。当触发器归档任何插入或更新时,它可以使用此列轻松查看谁进行了更改(我们感兴趣的是哪个应用程序用户,而不是数据库用户)。问题是对于删除,我们不会从执行的 SQL 中获取最后修改的信息,因为它只是一个普通的delete from x where y。
为了解决这个问题,我们想在执行任何操作之前执行一个存储过程来告诉数据库哪个应用用户登录了。然后,审计触发器会在删除发生时查看此值,并使用它来记录执行删除的人员。
是否有任何方法可以拦截开始事务或执行 SQL 或存储过程的其他方式来告诉 db 哪些用户正在执行将在事务中发生的插入/更新/删除,然后再执行其他操作操作发生了吗?
我对数据库端如何工作的细节了解不多,但如有必要,可以了解更多。要点是存储过程将创建一个包含会话变量的上下文,触发器将在删除时查询该上下文以获取用户 ID。
【问题讨论】:
-
在此处查看我的答案和相关链接,这些链接显示了如何通过使用 Oracle 的 CLIENT_IDENTIFIER 属性'{ call DBMS_SESSION.SET_IDENTIFIER('MY APP USER') } 的连接检出上的 AOP 切入点来完成此操作: stackoverflow.com/questions/39884243/…
-
@AlanHay - 你能发布答案吗?我最终使用了你的解决方案,你应该得到认可。
-
嗨@Chris Williams。我确实发布了答案
标签: java spring oracle hibernate jpa