0

在我的 Web 应用程序中,正在创建一个日志进程。我创建了一个更新触发器,它工作得很好,但我需要知道谁更新了这个数据,即执行这个操作的用户。

我已经用谷歌搜索并要求使用 context_info。这是什么意思?

如何将此信息存储在触发器表中?

这是我的程序..我使用了你的概念..

ALTER Procedure [dbo].[MIS_CompOffDate]   
(  
@EmpId nvarchar(20), 

@UserName nvarchar(50),

@ActualDate datetime,

@DayName nvarchar(20),

@CompOffDate datetime 

)  

As

Begin 

DECLARE @UserNameConverted VARBINARY(128) = CONVERT(VARBINARY(128), @EmpId);

SET CONTEXT_INFO @UserNameConverted;  

INSERT INTO MIS_BM_CompOff values(@EmpId, @UserName, @ActualDate, @DayName, @CompOffDate)

End

在empid-用户的empid里面...

4

4 回答 4

2

我遇到了同样的问题,并在 SO 中使用了一些答案来解决这个问题。我创建了一个存储过程sp_SetConnectionUsername来保存用户名,以及一个f_GetConnectionUsername可以在触发器中用于检索用户名的函数。因为CONTEXT_INFO以二进制形式存储数据,所以需要进行一些小技巧才能将 varchar 数据从中取出。请注意,限制CONTEXT_INFO为 128 个字节(即 128 个字符)。

这是从应用程序打开连接以设置用户名时调用的存储过程:

CREATE PROCEDURE [dbo].[sp_SetConnectionUsername]
    @username varchar(128)
AS
BEGIN
    -- Convert username varchar into binary
    DECLARE @binaryUsername varbinary(128)
    SET @binaryUsername = CAST(@username as varbinary(128))
    SET CONTEXT_INFO @binaryUsername
END

这是在触发器中调用以检索用户名的函数:

CREATE FUNCTION [dbo].[f_GetConnectionUsername]()
RETURNS varchar(128)
AS
BEGIN
    DECLARE @username varchar(128)

    -- Get binary from CONTEXT_INFO, convert to varchar, then remove all Char(0) 
    -- empty characters from it (these are used as spacing in binary). Otherwise,
    -- if CONTEXT_INFO has not been set, return the SQL Server username.
    IF CONTEXT_INFO() IS NOT NULL
        SET @username = REPLACE((select cast(CONTEXT_INFO() as varchar(128))) COLLATE 
            Latin1_General_BIN, CHAR(0), '')
    ELSE
        SET @username = SYSTEM_USER

    RETURN @username
END

希望可以帮助某人。

于 2015-03-03T13:29:39.210 回答
1

您可以使用触发器插入SYSTEM_USERUSER_NAME()插入表。因此,触发触发器的任何操作都将使用该人的登录名或用户名执行该操作。这是内部数据库。但是对于 Web 应用程序,您可以将操作者的登录名信息保存在任何成功登录后的变量中以及在任何更新中使用存储过程,并且请求的参数之一应该是该登录参数。

于 2013-11-11T08:34:07.120 回答
0

这可以按照以下步骤完成:

  1. 将用户 ID 或名称传递给您的更新功能/程序
  2. 在更新函数/过程中,使用SET CONTEXT_INFO将用户 ID 或名称设置为共享变量,如下所示:

    SET CONTEXT_INFO @UserID
    
  3. 在您的触发器中,使用CONTEXT_INFO()函数提取 ID :

    DECLARE @UserID BIGINT = COALESCE(CAST(CAST(CONTEXT_INFO() AS BINARY(8)) AS INT),0)
    
于 2013-11-11T08:42:03.970 回答
0

触发器只会知道您对表所做的更改,它不会知道实际插入/更新等外部的信息。

您最好从您的应用程序中处理它并将有关更新用户的信息与其他信息一起传递。

于 2013-11-11T08:27:58.567 回答