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.
你不能将变量传递给触发器.
获取触发器中信息的唯一方法是能够基于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)
| 归档时间: |
|
| 查看次数: |
31247 次 |
| 最近记录: |