2016-04-08 7 views
0

。例えば:コンプの\ Ws.App良い方法

このWebサービスは、SQLデータベースにストアドプロシージャを使用して、すべてのデータベースとの対話を行い、サービスアカウントは、すべての権利がそうしなければなりません。

我々は、クエリに関連するすべてのデータのためのWebサービスを使用してC#で書かれて構築されたネイティブ・クライアントを持っています。

私の問題は、我々は()SQL関数で構築したレコードUSER_NAMEを使用してユーザーをトリガを使用して、これらのデータベース・テーブルに監査を持っているということです。

はネイティブアプリを実行しているユーザーの名前が関数でSQLのビルドに渡されますことをする方法はありますか? USER_NAME()関数である必要はありませんが、組み込み関数で十分です。

私は避けるようにしようとしていますどのような以下の通りです:

  • 変更すべての機能は、すべてのオープン接続の文は、ユーザー名に

を渡すために

  • 変更をユーザー名を渡すために現在どのような私はアプリケーション名のSQL接続文字列を変更して、ユーザーIDを含め、これをAPP_NAME()の組み込みSQL関数から削除します

    ノート

    • ユーザーは、SQL Serverの

    その他の優れたソリューションへの直接アクセスを持っていませんか?

  • +0

    悪いことがあります接続プーリングを利用しません。それぞれの接続は異なるため、新しいプールからの接続となります。 – M27

    答えて

    1

    1つのオプションは、ユーザーIDをSQL Serverコンテキスト情報に格納することです。すぐにWebサービスの識別として、またはユーザを認証し、その後、Webサービスは、コンテキスト情報におけるユーザIDを格納し、これは次のようにストアドプロシージャを呼び出すことによって行うことができます。

    CREATE PROCEDURE SetUserContext 
        @UserId int 
    AS 
        DECLARE @uc binary(4) 
        SET @uc = CONVERT(binary(4), @UserId) 
        SET CONTEXT_INFO @ci 
    

    次に、監査証跡のトリガーこの1のようなコードを使用してコンテキスト情報からユーザIDをお読みください。

    もちろん
    DECLARE @UserId int 
    SET @UserId = CONVERT(int, SUBSTRING(CONTEXT_INFO(), 1, 4)) 
    

    あなたは、コンテキスト情報が失われた接続を閉じた場合、SetUserContextを呼び出した後のオープン接続を維持する必要があります。次のようにアクションのシーケンスは次のようになります。

    1. オープン接続
    2. コールSetUserContext
    3. APP_NAME()ソリューションの使用に関するコール他のストアドプロシージャを
    4. 閉じる接続
    +0

    これは良いアイデアです。私は、別のSPを実行する必要があるたびにSetUserContext SPを呼び出さないようにする方法があるかどうかを調べていました。利用できない場合は、おそらくこの道を行く可能性があります – Viv

    +0

    @Vivek。 'SqlConnection.StateChange'イベントで' SetUserContext'を呼び出すのはどうでしょうか? –

    +0

    それは同じだろう...このように考えると、Webサービスには複数のデータソースへのリンクがあり、それぞれに独自のオープンとクローズがあります。しかし、私が現在行っていることは、 2を呼び出し、そのExtension関数へのすべてのOpen接続呼び出しを置き換えます。簡単な方法がない限り、私はそれを残すでしょう。 – Viv