Informations d'arrière-plan:
- Je crée une collection de tables d'audit pour suivre les mises à jour et les suppressions d'un ensemble de tables de données pour mon application.
- Les enregistrements d'audit sont créés via des déclencheurs.
- DML dans la base de données de mon application proviendra généralement d'une connexion qu'un service utilise pour accéder à la base de données. Pour cette raison, je pense que le résultat de
SYSTEM_USERsera toujours le même lorsqu'il est appelé dans un déclencheur. - Mon application ne stocke pas de données utilisateur actuellement, bien qu'une chaîne lui
UserIdsoit donnée à chaque fois que DML doit être fait (fait exclusivement dans les procédures stockées).
Le problème que j'ai rencontré est que lorsqu'un utilisateur supprime un enregistrement, je veux savoir qui l'a fait. Parce que cela se fera par la même connexion, je ne veux pas voir que toutes les actions ont été effectuées par le service, je veux voir quel utilisateur l'a fait. Ce n'est pas un problème sur une mise à jour, car nous avons des ModifiedBycolonnes qui seront mises à jour via un envoyé UserIdsur les mises à jour.
La question est la suivante: existe-t-il un moyen de définir SYSTEM_USERou d'obtenir autrement les informations utilisateur dans le déclencheur lorsqu'une suppression est exécutée?
La "meilleure" idée que j'ai en ce moment, bien que je ne sois pas encore sûre que ce soit une bonne idée, est que dans le service, je vérifie si le courant UserIdest dans la base de données en tant qu'utilisateur, et si ce n'est pas le cas, créez un utilisateur objet pour eux. Exécutez ensuite les procédures stockées avec EXECUTE AS User = @UserId. Ensuite, lorsque DML est terminé dans la procédure stockée et que le déclencheur se déclenche, il SYSTEM_USERdoit renvoyer l'utilisateur à partir du EXECUTE AS.