将变量传递给触发器

Cod*_*uth 16 t-sql sql-server variables triggers sql-server-2000

我有一个trigger处理一些数据用于记录目的,如下所示:

CREATE TRIGGER trgDataUpdated
   ON tblData FOR UPDATE
AS 
BEGIN
    INSERT INTO tblLog ( ParentID, OldValue, NewValue, UserID )
    SELECT  deleted.ParentID, deleted.Value, inserted.Value, 
            @intUserID -- how can I pass this in?
    FROM    inserted INNER JOIN deleted ON inserted.ID = deleted.ID
END
Run Code Online (Sandbox Code Playgroud)

如何将变量@intUserID传入上面的触发器,如下面的代码所示:

DECLARE @intUserID int
SET @intUserID = 10

UPDATE tblData
SET    Value = @x
Run Code Online (Sandbox Code Playgroud)

PS:我知道我无法直接传入@intUserID触发器,它仅用于说明目的.

gbn*_*gbn 10

我用SET CONTEXT_INFO这种动作.这是一个2008+链接,之前的链接已经退役.

在SQL Server 2005+上,您必须CONTEXT_INFO阅读它,否则您必须从context_info列中获取dbo.sysprocesses.


KM.*_*KM. 5

你不能将变量传递给触发器.

获取触发器中信息的唯一方法是能够基于INSERTED或DELETED表对其进行SELECT选择,或者在受影响的表上添加一列并将值放入该列中.

编辑在上一个问题OP张贴了关于这一点,他们说,他们不想使用CONTEXT_INFO,但在这里,他们说这是好使用,所以这里是一个CONTEXT_INFO使用示例:

在执行更新的过程中

DECLARE @intUserID     int
       ,@CONTEXT_INFO  varbinary(128)
SET @intUserID = 10
SET @CONTEXT_INFO =cast('intUserID='+CONVERT(varchar(10),@intUserID)+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO

--do update that will fire the trigger

SET CONTEXT_INFO 0x0 
Run Code Online (Sandbox Code Playgroud)

这是检索值的触发器部分:

DECLARE @intUserID     int
       ,@sCONTEXT_INFO  varchar(128)
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE SPID=@@SPID

IF LEFT(@sCONTEXT_INFO,9)='intUserID'
BEGIN
    SET @intUserID=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10)
END
ELSE
BEGIN
    RAISERROR('intUserID was not specified',16,1)
    ROLLBACK TRAN
    RETURN
END

..use the @intUserID
Run Code Online (Sandbox Code Playgroud)


小智 5

我使用 sp_set_session_context 存储过程来设置该值:

exec sp_set_session_context @key = N'userid', @value = 123 
Run Code Online (Sandbox Code Playgroud)

在我的触发器中读取值:

DECLARE @userid int
SELECT @userid = cast(SESSION_CONTEXT(N'userid') as int)
Run Code Online (Sandbox Code Playgroud)