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
を文字通りトリガーに渡すことができないことは知っています。これは、説明の目的で使用されただけです。
この種のアクションには SET CONTEXT_INFO
を使用します。これは2008年以降のリンクです。 以前のリンク は廃止されました。
SQL Server 2005+では、それを読み取るために CONTEXT_INFO
が必要ですが、それ以外の場合は、context_info
のdbo.sysprocesses
列から取得する必要があります。
変数をトリガーに渡すことはできません。
トリガー内の情報を取得する唯一の方法は、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
変数をトリガーに渡すことはできません。ユーザーがデータベースに接続する方法に応じて、SYSTEM_USER
を使用して現在のユーザーをデータベースに接続することができます。
古い質問ですが、トリガーが呼び出される前に作成された一時テーブルがトリガーに表示されると誰も言及しなかったのはなぜですか?したがって、これは機能します。
SELECT 10 intUserID INTO #intUserID
UPDATE tblData
SET Value = @x
トリガーは一時テーブル#intUserIDを確認し、そこからIDを読み取ることができます。
トリガーを直接呼び出すことができないため、変数をトリガーに渡しません。これらは、データが挿入、変更、または削除された結果として実行されます。
これを試してみませんか:
CREATE TRIGGER trgDataUpdated
ON tblData FOR UPDATE
AS
BEGIN
EXECUTE tbLogUpdate intUserId
END
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)