Cible de database NLog et rôle d'application SQL Server

Nous remplaçons un «framework» de journalisation personnalisé avec NLog dans une application existante. Le problème est que l'application utilise les rôles d'application SQL Server, ce qui signifie qu'à chaque fois qu'elle ouvre une connection à SQL Server, elle exécute le sp_setapprole sp_setapprole.

Nous avons essayé de simuler ce comportement dans la configuration cible de la database:

 <commandText> exec sp_setapprole @roleName, @password; --first, set app. role INSERT dbo.Log --etc. </commandText> <parameter name="@roleName" value="..."> <parameter name="@password" value="..."> -- other logging parameters follow 

Cependant, cela génère l'erreur:

Les rôles d'application ne peuvent être activés qu'au niveau ad hoc.

Je préférerais éviter d'écrire ma propre cible puisque la cible de la database peut faire tout ce dont j'ai besoin, sauf la définition du rôle de l'application. J'espère donc qu'il est possible de se connecter à l'événement StateChange de la connection qui est créée par NLog en interne ou faire d'autres trucs.

TL; DR – Comment passer à un rôle d'application lors de la connection via la cible de database NLog?

Nous avons fini par créer notre propre cible basée sur (une version rognée de) la source et le code NLog DatabaseTarget de ce blog .

Voir le code source ici .

La cible est configurée (à peu près) de la même manière que la cible de database NLog, mais avec des fonctions de fièvre.