2

我正在尝试记录对数据库的所有更改,但无法找到将当前用户名获取到触发器的方法。我有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

对用户名的查询不会给出当前正在修改的用户,而是给出最近登录的用户。任何帮助表示赞赏。谢谢!

4

1 回答 1

3

就像 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。这样,当您处于当前连接中时,您将始终能够分辨出当前用户是谁。当然,这仅在您在用户登录的整个过程中都保持连接时才有效(可能不在基于 Web 的应用程序中)。

最后(不幸的是)不是使用触发器创建存储过程来进行插入。将当前用户作为参数列表的一部分传入 SP 并在那里进行日志记录。

抱歉,我帮不上什么忙。

于 2013-02-12T23:13:53.410 回答