問題: grails、SQL Server、および DBA を使用して、ユーザー DB アクティビティを監査するためにトリガーを使用したいと考えています (監査プラグインは認識しています)。彼らは、各データベース呼び出しの前に SQL Server の CONTEXT_INFO を設定し、コンテキストでユーザー名を設定し、トリガーによってプルされることを提案しました。検討しているのはGORMセーブ等の増強です。このような方法:
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 パターンを使用しており、これは同じ接続が再利用されていることを暗示しているように見えますが、私は推測しており、これに対する完全なテストを作成するのに苦労しています。ありがとう!