我正在尝试记录对数据库的所有更改,但无法找到将当前用户名获取到触发器的方法。我有triggerData
存储用户信息的表(guid (userid), data (username), logintime)
这些是在用户登录时插入的。
这是触发器
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
用户名的查询不会给出当前修改的用户,而是给出最近登录的用户。任何帮助表示赞赏。谢谢!
就像 marc_s 所说的那样,触发器可以并且将会每批应用一次。然而,就您而言,听起来您当前的应用程序每批仅插入一次,因此工作正常。但是,如果有人尝试插入多行,您就会遇到问题。比如说从应用程序的另一部分,或者从查询窗口。如果您想立即修复它还是等待它损坏(如果有的话),这完全取决于您。
我已经重新格式化了给您带来问题的查询。
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))
从这里你就可以看出你的问题出在哪里了。如果您查看 WHERE 子句,您将看到您专门拉取最后登录的行。如果您没有使用应用程序 ID(尽管听起来像是),您可以使用 USER_NAME() 或 SUSER_SNAME() 来拉取当前用户。不幸的是,根据您提供的信息,我认为您无法提取实际进行更改的用户,再次假设您正在使用应用程序 ID。
您可以尝试将 SPID(当前连接的 ID)放入用户表中。您可以将其检索为 @@SPID。这样,当您处于当前连接时,您将始终能够知道当前用户是谁。当然,只有当您在用户登录的整个过程中都保持连接时(可能不是在基于网络的应用程序中),这才有效。
最后(不幸的是最不重要的)是不要使用触发器创建存储过程来执行插入。将当前用户作为参数列表的一部分传递到 SP 中,并在那里进行日志记录。
抱歉我无法提供更多帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)