问题:使用 grails、SQL Server 和 DBA 想要使用触发器来审计用户 DB 活动(我知道审计插件)。他们建议在每次数据库调用之前设置 SQL Server 的 CONTEXT_INFO,在上下文中设置用户名,然后由触发器拉动。我正在考虑的是增加 GORM save 等。像这样的方法:
private replaceSave(domainClass) {
def saveMethod = domainClass.metaClass.pickMethod("save", [Map] as Class[])
domainClass.metaClass.save = { Map params ->
def sql = new Sql(dataSource)
sql.execute("DECLARE @U varbinary(0128);SET @U = CONVERT(varbinary(0128),'the-username');SET CONTEXT_INFO @U;")
saveMethod.invoke(delegate, [params] as Object[])
sql.execute("DECLARE @U varbinary(0128);SET @U = CONVERT(varbinary(0128),'');SET CONTEXT_INFO @U;")
}
}
我不知道这种技术是否会确保 saveMethod 使用的 dataSource 连接与 Sql 对象的连接使用的连接相同。我的理解是 Grails 使用 OpenSessionInView 模式,这似乎意味着重复使用相同的连接,但我只是猜测并且很难为此编写全面的测试。谢谢!