2010-04-15 74 views
11

我有一个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不能从字面上传递到触发,这只是用于说明目的。

回答

10

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

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

+0

我正在考虑这个,但它看起来不是最优雅的解决方案。如果这是唯一的方法,那么肯定我会做,但我希望有其他的东西:( – Codesleuth 2010-04-15 15:20:24

+0

@Codesleuth:你在这里是有限的... – gbn 2010-04-15 15:24:20

+1

我现在正在实施这个。只是想粘贴这个链接给任何人其他人希望在将来做到这一点:http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx – Codesleuth 2010-04-15 15:51:01

0

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

+1

我不是在寻找一个是/否的答案在这里。当然,有一种方法可以存储触发器可以接收的当前事务的信息吗? – Codesleuth 2010-04-15 15:17:24

3

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

获取触发器中信息的唯一方法是能够根据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 [email protected]@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 
1

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

0

为什么不试试这个:

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