1

问题:使用 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 模式,这似乎意味着重复使用相同的连接,但我只是猜测并且很难为此编写全面的测试。谢谢!

4

0 回答 0