comment get le nom d'user dans le triggersur sql lorsque plusieurs users se sont connectés à partir de l'appartenance à un server ASP

J'essaye de noter toutes les modifications à la database mais n'ai pas pu find un moyen d'get le nom d'user courant au triggersur. J'ai une table sortingggerData qui stocke les informations de l'user (guid (userid), data (username), logintime) qui sont insérées lorsque l'user se connecte.

Voici le triggersur

 declare @UserIsOnlineTimeWindow DateTime declare @currenttime DateTime set @currenttime = GETDATE() set @UserIsOnlineTimeWindow = 10 DECLARE @uname nvarchar(max) **set @uname = (SELECT T.UserName from (SELECT distinct u.UserName FROM aspnet_Users u WHERE IsAnonymous = 'FALSE' AND ((@currenttime - @UserIsOnlineTimeWindow) < u.LastActivityDate)) as t, TriggerData td, aspnet_Users au WHERE t.UserName = td.Data and td.guid = au.UserId and td.logintime = (select MAX(td.logintime) from TriggerData td))** DECLARE @ComputerName nvarchar(50) DECLARE @IPAddr nvarchar(50) DECLARE @BroadcastIP nvarchar(50) DECLARE @auditInsert nvarchar(255) SET @ComputerName = (SELECT ComputerName FROM inserted) SET @IPAddr = (SELECT ISNULL(IPAddr,0) FROM inserted) SET @BroadcastIP = (SELECT ISNULL(BroadcastIP,0) FROM inserted) SET @auditInsert = @ComputerName+' '+@IPAddr+' '+@BroadcastIP Begin INSERT INTO Audit(OldInfo ,NewInfo,[User],Date1,Type,TableName) VALUES('New Record',@auditInsert, @uname ,GETDATE(),'Added','LabIP') End 

La requête pour le nom d'user ne donne pas l'user en cours de modification à la place, il donne l'user récemment connecté. Toute aide est appréciée. Merci!

Comme marc_s, les triggersurs peuvent et seront appliqués une fois par lot. Dans votre cas, cependant, il semble que votre application actuelle n'insère qu'une seule fois par lot, donc cela fonctionne bien. Vous aurez cependant un problème si quelqu'un essaie d'insert plus d'une ligne. Dites d'une autre partie de l'application ou d'une window de requête. C'est vraiment à vous de décider si vous voulez le réparer maintenant ou attendre qu'il se casse (si jamais).

J'ai reformulé la requête qui vous pose problème.

 set @uname = (SELECT T.UserName FROM (SELECT DISTINCT u.UserName FROM aspnet_Users u WHERE IsAnonymous = 'FALSE' AND ((@currenttime - @UserIsOnlineTimeWindow) < u.LastActivityDate)) AS t JOIN TriggerData td ON t.UserName = td.Data JOIN aspnet_Users au ON td.guid = au.UserId WHERE td.logintime = (select MAX(td.logintime) from TriggerData td)) 

Vous pouvez voir à partir de là où est votre problème. Si vous regardez dans la clause WHERE, vous verrez que vous tirez spécifiquement sur la ligne qui s'est connectée la dernière fois. Si vous n'utilisez pas d'ID d'application (bien que cela vous semble), vous pouvez utiliser USER_NAME () ou SUSER_SNAME () pour tirer. l'user actuel. Malheureusement, basé sur les informations que vous avez fournies, je ne pense pas que vous serez en mesure de tirer l'user qui a réellement fait la modification, à nouveau en supposant que vous utilisez un identifiant d'application.

Vous pouvez essayer de mettre le SPID (id pour la connection actuelle) dans votre table d'users. Vous pouvez récupérer ceci comme @@ SPID. De cette façon, lorsque vous êtes dans la connection actuelle, vous serez toujours en mesure de dire qui est l'user actuel. Bien sûr, cela ne fonctionnera que si vous maintenez la connection pendant tout le time où l'user est connecté (probablement pas dans une application web).

Dernier (et malheureusement less) est plutôt que d'utiliser des triggersurs créer des procédures stockées pour faire vos insertions. Transmettez l'user actuel dans le SP dans la list des parameters et effectuez votre journalisation ici.

Désolé, je ne pouvais pas aider plus.