SqlContext 개체

프로시저 또는 함수를 호출하거나, CLR(공용 언어 런타임) 사용자 정의 형식의 메서드를 호출하거나, 사용자의 동작이 Microsoft .NET Framework 언어로 정의된 트리거를 발생시키면 서버에서 관리 코드가 호출됩니다. 이러한 코드 실행은 사용자 연결의 일부로 요청되므로 서버에서 실행되는 코드에서 호출자의 컨텍스트에 대한 액세스가 필요합니다. 또한 특정 데이터 액세스 작업은 호출자의 컨텍스트에서 실행해야만 유효합니다. 예를 들어 트리거 작업에서 사용된 삽입되거나 삭제된 의사 테이블에 대한 액세스는 호출자의 컨텍스트에서만 유효합니다.

호출자의 컨텍스트는 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 클래스를 쿼리하면 현재 실행 중인 코드가 in-process로 실행 중인지 확인할 수 있습니다. 이렇게 하려면 SqlContext 개체의 IsAvailable 속성을 확인합니다. IsAvailable 속성은 읽기 전용이며, 호출 코드가 SQL Server 내에서 실행 중이고 다른 SqlContext 멤버에 액세스가 허용되면 True를 반환합니다. IsAvailable 속성이 False를 반환하는 경우 다른 모든 SqlContext 멤버를 사용하면 InvalidOperationException이 throw됩니다. IsAvailable이 False를 반환하는 경우 연결 문자열에 "context connection=true"가 있는 연결 개체를 열려고 하면 오류가 발생합니다.

Windows ID 검색

SQL Server 내에서 실행되는 CLR 코드는 항상 프로세스 계정의 컨텍스트에서 호출됩니다. 코드에서 SQL Server 프로세스 ID 대신 호출 사용자의 ID를 사용하여 특정 동작을 수행해야 하는 경우 SqlContext 개체의 WindowsIdentity 속성을 통해 가장 토큰을 얻어야 합니다. WindowsIdentity 속성은 호출자의 Microsoft Windows ID를 나타내는 WindowsIdentity 인스턴스를 반환하며, 클라이언트가 SQL Server 인증을 사용하여 인증된 경우에는 Null을 반환합니다. 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 In-Process 전용 확장