2017-06-01 3 views
0

Je veux accomplir cela lorsque l'utilisateur "123" se connecte à l'application et modifie ensuite les données dans la base de données, que cette modification sera enregistrée dans une table miroir avec " 123 "dans une colonne supplémentaire. L'idée était d'écrire un déclencheur qui enregistre "inséré" ou "supprimé" dans la table miroir, mais le problème est que l'application utilise toujours le même utilisateur de base de données, donc j'ai besoin de connecter l'utilisateur de l'application avec la base de données en quelque sorte. Donc, mon idée était d'enregistrer @@ SPID avec l'utilisateur de l'application dans une table lorsqu'un utilisateur se connecte à l'application. Malheureusement, j'ai pensé que @@ SPID peut être différent pour chaque requête, même si j'utilise la même classe ADOConnection.SQL Server: journalisation des modifications de base de données basée sur l'utilisateur de l'application

Je ne peux pas non plus utiliser le nom d'application ou le nom d'hôte, car il se peut que différents utilisateurs sur le même serveur démarrent la même application et je devrais pouvoir différencier les changements du premier utilisateur des changements de seconde l'utilisateur a fait.

L'application est très volumineuse. Par conséquent, la mise à jour de chaque requête pour consigner manuellement les modifications n'est pas une option actuellement.

Existe-t-il une autre solution à ce problème?

+0

similaire à https://stackoverflow.com/questions/648166/how-to-get-windows-log-in-user-name-for-a-sql-log-in-user – PacoDePaco

+0

Sont vos utilisateurs du domaine usrs ? Voulez-vous connaître le compte de domaine d'un utilisateur qui se connecte au serveur à l'aide de la connexion SQL Server (via votre application)? – sepupic

Répondre

0

J'ai trouvé une solution pour moi-même maintenant: Utilisez host_process_id.

Fondamentalement, lorsqu'un utilisateur de l'application se connecte, vous pouvez le connecter à host_process_id dans la table système dm_exec_sessions. Ensuite, quand un déclencheur s'exécute, vous pouvez obtenir le host_process_id de @@ SPID pour savoir quel utilisateur a fait la modification.

Même si @@ SPID change, host_process_id reste le même, mais sa valeur est différente lorsque la même application s'exécute deux fois sur le même serveur.

0

Le meilleur moyen est de capturer les informations utilisateur dans chaque table par rapport à l'enregistrement modifié/inséré/supprimé. Lorsque l'utilisateur apporte des modifications à l'enregistrement, mettez à jour ses informations comme ID dans la colonne "LastModifiedBy". Cela devrait résoudre le problème de la capture des informations utilisateur .-- Comme je ne vois pas d'autre moyen possible pour cela

La solution simple pour la journalisation d'audit est d'activer SQL Change Data Capture sur votre table de base de données. Il prendra soin de consigner les informations d'audit dans les tables système créées par lui. Mais s'il vous plaît noter que CDC a une période de rétention, il est généralement de 3 jours. Donc, tous les trois jours, les données seront effacées des tables CDC. Vous pouvez explorer l'opportunité de désactiver le nettoyage afin de stocker définitivement les informations dans les tables CDC OU simplement écrire un service Windows .Net ou un package SSIS pour extraire des informations des tables CDC et les transférer vers une autre base de données Audit.