2010-08-04 49 views
6

对于一个像兄弟一样工作的安全系统(比如监视强制访问控制),我们必须拦截并处理hibernate产生的所有选择语句。我们将用户,时间戳和sql select存储在数据库中,以便使用其他工具进行分析。这些信息可以确定用户试图查看的内容。对于select语句,准备好的属性是有价值的。我们需要包含所有参数的完整SQL语句。如何拦截Hibernate生成的SQL?

有没有我们可以加入和处理所有这些事情的监听器或拦截器?迄今为止最大的突出问题是收集语句参数。

谢谢

+0

mkyong声称p6spy.jar将显示具有参数值的hibernate查询。也许你可以试试这个http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/ – Naveen 2010-08-04 07:52:40

回答

3

当日志级别为org.hibernate package is set to DEBUG, and with the hibernate.show_sql property set.时,实际参数值碰巧可用(至少据我所知)如果您想在数据库本身中使用记录器输出,请使用JDBCAppender。

或者,你可以看看的log4jdbc project,号称如下:

在记录的输出,为准备 语句,绑定参数是 自动插入SQL 输出。这极大地提高了 可读性和调试的许多 个案。

如果这不合适,您可以调查是否P6Spy can be used in your situation。在WebLogic Server上,通过WebLogic JDBC Spy可以实现等效功能,该功能是为特定数据库提供的WebLogic JDBC驱动程序的开箱即用功能。这两个都写入到System.out而不是数据库(除非我错了),所以它可能没有那么有用。

+0

这非常有效,我写了自己的appender来向数据库写入语句。唯一站在我的路上的是如何让相应的用户发起这个声明。这几乎不可能解决。有任何想法吗? – codevour 2010-08-05 08:37:15

+1

我对此并不确定,因为我还没有尝试过。基本上,您需要将正在执行SQL语句的用户/主体映射到正在记录的数据。在SLF4J/log4j/logback中,这是通过MDC - Mapped Diagnostic Context实现的。您的模式字符串也需要修改以适应委托人。关于让MDC在logback中工作的文章可能有所帮助 - http://logback.qos.ch/manual/mdc.html顺便说一下,如果可以修改appender模式字符串以反映用户,那么您不需要MDC (如果这是缺少格式字符串的情况)。 – 2010-08-05 09:43:52

+0

非常感谢你,我选择了log4jdbc项目,因为它是最活跃的项目,结果非常好。再次感谢。 – codevour 2010-08-06 11:40:12

3

您可以使用Interceptor.prepareSQL()(3.1+)拦截准备好的声明。

我不认为你可以得到实际的参数,而不会在抽象层下去。可能的解决方案是使用JDBC代理驱动程序(请参阅P6Spy)。

希望有所帮助。

+0

是的,知道这个接口,在哪里得到有界参数?据我所知,没有办法得到实际的参数。 – codevour 2010-08-04 07:22:23

+0

确切地说,它是'Interceptor#onPrepareStatement(String sql)'。但是,这使您可以访问正在准备的SQL字符串,而不是*生成的*查询。 – 2010-08-04 08:11:41