次の方法で共有


SqlContext オブジェクト

適用対象:SQL Server

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

呼び出し元のコンテキストは、SqlContext オブジェクトに抽象化されます。 詳細については、「Microsoft.SqlServer.Server.SqlContext」を参照してください。

SqlContext では、次のコンポーネントにアクセスできます。

コンポーネント 形容
SqlPipe このオブジェクトは、結果がクライアントに送 パイプを表します。 詳細については、「SqlPipe オブジェクトの」を参照してください。
SqlTriggerContext このオブジェクトは、CLR トリガー内からのみ取得できます。 このオブジェクトでは、トリガーを起動した操作や、更新された列のマップについての情報を提供します。 詳細については、「SqlTriggerContext オブジェクトする」を参照してください。
IsAvailable このプロパティは、コンテキストの可用性を判断するために使用されます。
WindowsIdentity このプロパティは、呼び出し元の Windows ID を取得するために使用されます。

コンテキストの可用性を決定する

SqlContext オブジェクトの IsAvailable プロパティを確認して、SqlContext クラスにクエリを実行して、現在実行中のコードがインプロセスで実行されているかどうかを確認します。 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 プロパティは、呼び出し元の Windows ID を表す WindowsIdentity インスタンスを返します。クライアントが SQL Server 認証を使用して認証された場合は null を返します。 このプロパティにアクセスできるのは、EXTERNAL_ACCESS 権限または UNSAFE 権限でマークされたアセンブリだけです。

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

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

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

  • C# を する
  • Visual Basic .NET の
[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;
    }
}
  • SqlPipe オブジェクト の
  • SqlTriggerContext オブジェクト の
  • CLR トリガーの
  • ADO.NETに対する SQL Server のインプロセス固有の拡張機能の