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.
- Requête SQL pour l'extraction de données
- Construire une masortingce de comparaisons dans SQl Server
- Données appropriées Tapez dans SQL Server pour stocker la valeur de notation scientifique? (Ex. 10 ^ 3)
- Le thread .net DbProviderFactory est-il sécurisé?
- Comment stocker des données sensibles de différents clients dans le server SQL?
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.