2012-03-01 9 views
2

私はWindowsフォームアプリケーションとCustomersテーブルを持っており、それに対応するテーブルはDB(Customer)です。 WinFormテーブルを編集して保存ボタンをクリックすると、stored procedureが実行され、DBのCustomerテーブルが更新されます。テーブルが更新されると、triggerが実行されます。 Triggerは、ログの目的でいくつかstored procedureを実行し、データをログテーブルに保存します。 Environment.UserNameCustomerテーブルに保存せずにログテーブルに渡す必要があります。つまり最終ログテーブルに渡す必要がありますが、テーブルにはCustomerテーブルに追加できません。そして、私はそれをやる方法を知らない。それを行う方法はありますか?SQL Server 2008のトリガからストアドプロシージャに一時データを渡す方法

ありがとうございました。

答えて

3

接続コンテキストにユーザー名を格納できます(varbinaryとしてエンコードします)。

DECLARE @a VARBINARY(128) 
    SET @a = CAST('myuser' AS VARBINARY(128)) 
    SET CONTEXT_INFO @a 

ここで、@aにはエンコードされたユーザー名が含まれています。あなたのトリガーでは、関数CONTEXT_INFO()でコンテキスト情報を取得し、それをvarcharにデコードすることができます。

SELECT cast(CONTEXT_INFO() as VARCHAR(128)) 
+0

Management StudioからCONTEXT_INFO()を呼び出す場合、NULLを返しますか? – Arterius

+0

接続コンテキストは、元の接続でのみ使用できます。 'SET CONTEXT_INFO'を実行しなかった場合、実際にはnullが返されます。 –

+0

ありがとうございます!私はこの方法が私の場合の唯一の可能な方法だと思う。 – Arterius

1

トリガーにパラメータを渡すことをお勧めしますか?

ユーザーを認識するためにトリガー本体にsuser_sname()機能を使用することを検討してください。

トリガーからストアドプロシージャへのロジックの移動と、cuurentユーザーに関する情報のストアドプロシージャへの渡しです。

+1

私の場合、suser_sname()はWindowsユーザー名ではなくユーザー名「sa」を返します。 – Arterius

+1

データベースに接続するために 'sa'アカウントを使用するとセキュリティルールはほとんど変わりませんが、大きなリファクタのコストがプロジェクトスポンサーにとって高くなることがあることを完全に理解しています。おそらくあなたのためのいくつかのオプションは 'host_name()'関数です。これはユーザのワークステーション名に関する情報を提供します。 – Radek

関連する問題