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 インプロセス固有の拡張機能