0

私の Web アプリケーションでは、ログ プロセスを作成しています。更新トリガーを作成しましたが、完全に機能していますが、誰がこのデータを更新したか、つまりこのアクションを実行したユーザーを知る必要があります。

私はそれをグーグルで検索し、context_info を使用するように依頼しました。どういう意味ですか?

この情報をトリガーテーブルに保存する方法は?

これは私の手順です..私はあなたのコンセプトを使用しました..

ALTER Procedure [dbo].[MIS_CompOffDate]   
(  
@EmpId nvarchar(20), 

@UserName nvarchar(50),

@ActualDate datetime,

@DayName nvarchar(20),

@CompOffDate datetime 

)  

As

Begin 

DECLARE @UserNameConverted VARBINARY(128) = CONVERT(VARBINARY(128), @EmpId);

SET CONTEXT_INFO @UserNameConverted;  

INSERT INTO MIS_BM_CompOff values(@EmpId, @UserName, @ActualDate, @DayName, @CompOffDate)

End

empid には、ユーザーの empid があります...

4

4 に答える 4

2

私はこれと同じ問題を抱えていて、この問題を解決するために SO 全体でいくつかの回答を使用しました。ユーザー名を保存するためのストアド プロシージャと、ユーザー名を取得するためにトリガー内で使用できるsp_SetConnectionUsername関数を作成しました。f_GetConnectionUsernameはデータをバイナリで格納するためCONTEXT_INFO、varchar データを元に戻すには少し手直しが必要です。CONTEXT_INFOの制限は 128 バイト (つまり 128 文字)であることに注意してください。

ユーザー名を設定するためにアプリケーションから接続を開くときに呼び出されるストアド プロシージャを次に示します。

CREATE PROCEDURE [dbo].[sp_SetConnectionUsername]
    @username varchar(128)
AS
BEGIN
    -- Convert username varchar into binary
    DECLARE @binaryUsername varbinary(128)
    SET @binaryUsername = CAST(@username as varbinary(128))
    SET CONTEXT_INFO @binaryUsername
END

ユーザー名を取得するためにトリガーで呼び出される関数は次のとおりです。

CREATE FUNCTION [dbo].[f_GetConnectionUsername]()
RETURNS varchar(128)
AS
BEGIN
    DECLARE @username varchar(128)

    -- Get binary from CONTEXT_INFO, convert to varchar, then remove all Char(0) 
    -- empty characters from it (these are used as spacing in binary). Otherwise,
    -- if CONTEXT_INFO has not been set, return the SQL Server username.
    IF CONTEXT_INFO() IS NOT NULL
        SET @username = REPLACE((select cast(CONTEXT_INFO() as varchar(128))) COLLATE 
            Latin1_General_BIN, CHAR(0), '')
    ELSE
        SET @username = SYSTEM_USER

    RETURN @username
END

誰かを助けることができることを願っています。

于 2015-03-03T13:29:39.210 に答える
0

トリガーは、テーブルに加えた変更についてのみ認識し、実際の挿入/更新以外の情報については認識しません。

アプリケーションからそれを処理し、更新ユーザーに関する情報を他の情報と一緒に渡す方がよいでしょう。

于 2013-11-11T08:27:58.567 に答える
0

これは、次の手順に従って実行できます。

  1. 更新関数/手順にユーザー ID または名前を渡します
  2. 更新関数/手順では、次のようにSET CONTEXT_INFOを使用して、ユーザー ID または名前を共有変数として設定します。

    SET CONTEXT_INFO @UserID
    
  3. トリガーで、 CONTEXT_INFO()関数を使用して ID を抽出します。

    DECLARE @UserID BIGINT = COALESCE(CAST(CAST(CONTEXT_INFO() AS BINARY(8)) AS INT),0)
    
于 2013-11-11T08:42:03.970 に答える