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_USER
sera 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
UserId
soit 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 ModifiedBy
colonnes qui seront mises à jour via un envoyé UserId
sur les mises à jour.
La question est la suivante: existe-t-il un moyen de définir SYSTEM_USER
ou 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 UserId
est 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_USER
doit renvoyer l'utilisateur à partir du EXECUTE AS
.