web-dev-qa-db-ja.com

変数をトリガーに渡す

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を文字通りトリガーに渡すことができないことは知っています。これは、説明の目的で使用されただけです。

16
Codesleuth

この種のアクションには SET CONTEXT_INFO を使用します。これは2008年以降のリンクです。 以前のリンク は廃止されました。

SQL Server 2005+では、それを読み取るために CONTEXT_INFO が必要ですが、それ以外の場合は、context_infodbo.sysprocesses列から取得する必要があります。

10
gbn

変数をトリガーに渡すことはできません。

トリガー内の情報を取得する唯一の方法は、INSERTEDまたはDELETEDテーブルに基づいて情報を選択するか、影響を受けるテーブルに列を追加してその列に値を入力できるようにすることです。

[〜#〜] edit [〜#〜] OPがこれについて投稿した前の質問で、CONTEXT_INFOを使用したくないと言っていましたが、ここではOkを使用するので、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
5
KM.

変数をトリガーに渡すことはできません。ユーザーがデータベースに接続する方法に応じて、SYSTEM_USERを使用して現在のユーザーをデータベースに接続することができます。

1
codingbadger

古い質問ですが、トリガーが呼び出される前に作成された一時テーブルがトリガーに表示されると誰も言及しなかったのはなぜですか?したがって、これは機能します。

SELECT 10 intUserID INTO #intUserID

UPDATE tblData
SET    Value = @x

トリガーは一時テーブル#intUserIDを確認し、そこからIDを読み取ることができます。

1
mark

トリガーを直接呼び出すことができないため、変数をトリガーに渡しません。これらは、データが挿入、変更、または削除された結果として実行されます。

0
Randy Minder

これを試してみませんか:

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

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)
0
Victoria Berger