次の方法で共有


SqlContext オブジェクト

プロシージャまたは関数を呼び出すとき、共通言語ランタイム (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 クラスをクエリすると、現在実行しているコードがインプロセスで実行されているかどうかを判定できます。 これを行うには、IsAvailable オブジェクトの SqlContext プロパティを確認します。 プロパティはIsAvailable読み取り専用であり、呼び出し元のコードがSQL Server内で実行されている場合、および他SqlContextのメンバーにアクセスできる場合は を返Trueします。 IsAvailable プロパティから False が返された場合、他のすべての SqlContext メンバーから InvalidOperationException がスローされます (ただし、この例外が使用されている場合に限ります)。 IsAvailable プロパティから False が返された場合、接続文字列で "context connection=true" が指定されている接続オブジェクトを開く操作は失敗します。

Windows ID の取得

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

WindowsIdentity オブジェクトの取得後、呼び出し元は、クライアント アカウントの権限を借用して、操作を実行できます。

ストアド プロシージャまたは関数の実行を開始したユーザーが Windows 認証を使用してサーバーに接続している場合、SqlContext.WindowsIdentity が呼び出し元ユーザーの ID を取得する唯一の手段となります。 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 インプロセス固有の拡張機能