2010-04-15 41 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