将变量传递给触发器

时间:2010-04-15 15:13:19

标签: sql-server tsql 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

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

DECLARE @intUserID int
SET @intUserID = 10

UPDATE tblData
SET    Value = @x

PS:我知道我无法直接将@intUserID传递给触发器,它只是用于说明目的。

7 个答案:

答案 0 :(得分:10)

我使用SET CONTEXT_INFO进行此类操作。这是一个2008+链接,prior link已经退休。

在SQL Server 2005+上,您需要CONTEXT_INFO才能阅读它,否则您必须从context_info的{​​{1}}列获取。

答案 1 :(得分:5)

您无法将变量传递给触发器。

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

在上一个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 

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

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

答案 2 :(得分:2)

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

exec sp_set_session_context @key = N'userid', @value = 123 

然后在我的触发器中读取值:

DECLARE @userid int
SELECT @userid = cast(SESSION_CONTEXT(N'userid') as int)

答案 3 :(得分:1)

您无法将变量传递给触发器。根据用户连接数据库的方式,您可以使用SYSTEM_USER来获取连接到数据库的当前用户。

答案 4 :(得分:1)

老问题,但我想知道为什么没有人提到在调用触发器之前创建的临时表在触发器中可见? 所以,这可行:

SELECT 10 intUserID INTO #intUserID

UPDATE tblData
SET    Value = @x

触发器将看到临时表#intUserID,并可以从那里读取id。

答案 5 :(得分:0)

您不会将变量传递给触发器,因为您无法直接调用触发器。它们是由于插入,修改或删除数据而执行的。

答案 6 :(得分:0)

为什么不试试这个:

CREATE TRIGGER trgDataUpdated
   ON tblData FOR UPDATE
AS 
BEGIN
    EXECUTE tbLogUpdate intUserId
END