我有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
传递给触发器,它只是用于说明目的。
答案 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