Share via


SqlContext オブジェクト

適用対象:SQL Server

プロシージャまたは関数を呼び出すとき、共通言語ランタイム (CLR) ユーザー定義型のメソッドを呼び出すとき、またはアクションが Microsoft .NET Framework 言語で定義されているトリガーを実行するときに、サーバーでマネージド コードを呼び出します。 このコードの実行はユーザー接続の一環として要求されるので、サーバーで実行しているコードから呼び出し元のコンテキストにアクセスできる必要があります。 また、特定のデータ アクセス操作には、コードが呼び出し元のコンテキストで実行されている場合にしか有効にならないものもあります。 たとえば、トリガー操作で使用される inserted 擬似テーブルや deleted 擬似テーブルにアクセスするには、コードが呼び出し元のコンテキストで実行されている必要があります。

呼び出し元のコンテキストは、 SqlContext オブジェクトに抽象化されます。 SqlTriggerContext のメソッドとプロパティの詳細については、.NET Framework SDK の Microsoft.SqlServer.Server.SqlTriggerContext クラス リファレンス ドキュメントを参照してください。

SqlContext は、次のコンポーネントへのアクセスを提供します。

  • SqlPipe: SqlPipe オブジェクトは、結果がクライアントに流れる "パイプ" を表します。 SqlPipe オブジェクトの詳細については、「SqlPipe オブジェクト」を参照してください。

  • SqlTriggerContext: SqlTriggerContext オブジェクトは、CLR トリガー内からのみ取得できます。 このオブジェクトでは、トリガーを起動した操作や、更新された列のマップについての情報を提供します。 SqlTriggerContext オブジェクトの詳細については、「SqlTriggerContext オブジェクト」を参照してください。

  • IsAvailable: IsAvailable プロパティは、コンテキストの可用性を判断するために使用されます。

  • WindowsIdentity: WindowsIdentity プロパティは、呼び出し元の Windows ID を取得するために使用されます。

コンテキスト可用性の判断

SqlContext クラスにクエリを実行して、現在実行中のコードがインプロセスで実行されているかどうかを確認します。 これを行うには、SqlContext オブジェクトの IsAvailable プロパティをチェックします。 IsAvailable プロパティは読み取り専用であり、呼び出し元のコードがSQL Server内で実行されている場合、および他の SqlContext メンバーにアクセスできる場合は True を返します。 IsAvailable プロパティが False を返す場合、他のすべての SqlContext メンバーは、使用されている場合は InvalidOperationException をスローします。 IsAvailableFalse を返した場合、接続文字列で "context connection=true" を持つ接続オブジェクトを開こうとすると失敗します。

Windows ID の取得

SQL Server 内部で実行される CLR コードは、常にプロセス アカウントのコンテキスト内で呼び出されます。 コードで、SQL Server プロセス ID ではなく呼び出し元ユーザーの ID を使用して特定のアクションを実行する必要がある場合は、SqlContext オブジェクトの WindowsIdentity プロパティを使用して偽装トークンを取得する必要があります。 WindowsIdentity プロパティは、呼び出し元の Microsoft Windows ID を表す WindowsIdentity インスタンスを返し、クライアントが認証を使用して認証された場合は null SQL Server返します。 このプロパティにアクセスできるのは、 EXTERNAL_ACCESS または UNSAFE 権限でマークされたアセンブリのみです。

WindowsIdentity オブジェクトを取得した後、呼び出し元はクライアント アカウントを偽装し、代わりにアクションを実行できます。

呼び出し元の ID は、Windows 認証を使用してサーバーに接続されたストアド プロシージャまたは関数の実行を開始したクライアントの場合、 SqlContext.WindowsIdentity 経由でのみ使用できます。 SQL Server 認証が使用された場合、このプロパティは null になり、コードは呼び出し元を偽装できません。

次の例では、呼び出し元であるクライアントの Windows ID を取得し、クライアントの権限を借用する方法を示します。

C#

[Microsoft.SqlServer.Server.SqlProcedure]  
public static void WindowsIDTestProc()  
{  
    WindowsIdentity clientId = null;  
    WindowsImpersonationContext impersonatedUser = null;  
  
    // Get the client ID.  
    clientId = SqlContext.WindowsIdentity;  
  
    // This outer try block is used to thwart exception filter   
    // attacks which would prevent the inner finally   
    // block from executing and resetting the impersonation.  
    try  
    {  
        try  
        {  
            impersonatedUser = clientId.Impersonate();  
            if (impersonatedUser != null)  
            {  
                // Perform some action using impersonation.  
            }  
        }  
        finally  
        {  
            // Undo impersonation.  
            if (impersonatedUser != null)  
                impersonatedUser.Undo();  
        }  
    }  
    catch  
    {  
        throw;  
    }  
}  

Visual Basic

<Microsoft.SqlServer.Server.SqlProcedure()> _  
Public Shared Sub  WindowsIDTestProcVB ()  
    Dim clientId As WindowsIdentity  
    Dim impersonatedUser As WindowsImpersonationContext  
  
    ' Get the client ID.  
    clientId = SqlContext.WindowsIdentity  
  
    ' This outer try block is used to thwart exception filter   
    ' attacks which would prevent the inner finally   
    ' block from executing and resetting the impersonation.  
  
    Try  
        Try  
  
            impersonatedUser = clientId.Impersonate()  
  
            If impersonatedUser IsNot Nothing Then  
                ' Perform some action using impersonation.  
            End If  
  
        Finally  
            ' Undo impersonation.  
            If impersonatedUser IsNot Nothing Then  
                impersonatedUser.Undo()  
            End If  
        End Try  
  
    Catch e As Exception  
  
        Throw e  
  
    End Try  
End Sub  

参照

SqlPipe オブジェクト
SqlTriggerContext オブジェクト
CLR トリガー
ADO.NET に対する SQL Server インプロセス固有の拡張機能