Udostępnij przez


Obiekt SqlContext

Wywołanie kod zarządzany na serwerze podczas wywoływania procedury lub funkcja, gdy wywołania metoda na język (CLR) w czasie wykonywania przez użytkownika typu wspólnego lub podczas swojego akcja uruchomieniu wyzwalacza zdefiniowane w dowolnym Microsoft Języki systemu .NET framework. Ponieważ w ramach połączenia użytkownika jest wymagane wykonanie tego kodu, wymagany jest dostęp do kontekstu obiektu wywołującego z kodu, uruchomionego na serwerze.Ponadto pewne operacje dostępu do danych może być tylko wtedy, gdy działa w kontekście wywołującego.Na przykład dostęp do wstawionych i usuniętych pseudo-tables w operacjach wyzwalacz jest prawidłowa tylko w kontekście wywołującego.

Kontekst obiektu wywołującego jest pobieranej w SqlContext obiekt. Aby uzyskać więcej informacji na temat SqlTriggerContext metody i właściwości, zobacz temat Microsoft.SqlServer.Server.SqlTriggerContext Klasa dokumentacji w .NET Framework SDK.

SqlContext zapewnia dostęp do następujących składników:

  • SqlPipe: SqlPipeobiekt reprezentuje "potoku" za pomocą których wyniki przepływ do klient. Aby uzyskać więcej informacji na temat SqlPipe obiektów, zobacz Obiekt SqlPipe.

  • SqlTriggerContext: SqlTriggerContext obiekt tylko można pobrać z wyzwalaczem środowiska CLR. Zawiera informacje o operacji, która spowodowała uruchomienie wyzwalacza i mapowanie kolumn, które zostały zaktualizowane.Aby uzyskać więcej informacji na temat SqlTriggerContext obiektów, zobacz Obiekt SqlTriggerContext.

  • IsAvailable: IsAvailable Właściwość jest używana do określania dostępności kontekstu.

  • WindowsIdentity: WindowsIdentity Właściwość jest używana do pobierania Windows tożsamości obiektu wywołującego.

Określanie dostępności kontekstu

Kwerendy SqlContext Klasa, aby sprawdzić, czy obecnie wykonywanie kodu jest uruchomiona w procesie. Aby to zrobić, należy sprawdzić IsAvailable Właściwość SqlContext obiekt. The IsAvailable właściwość is read-only, and returns True if the calling code is running inside SQL Server and if other SqlContext members can be accessed. Jeśli IsAvailable Zwraca wartość właściwość False, wszystkie inne SqlContext Zgłoś członków InvalidOperationException, jeśli używana. Jeśli IsAvailable Zwraca False, dowolne próbował otworzyć obiekt połączenia, który ma "połączenia kontekstu = true" w ciąg połączenia nie powiedzie się.

Pobieranie tożsamości systemu Windows

Kod CLR wykonywanie wewnątrz SQL Server zawsze jest wywoływany w kontekście konta procesu. Jeśli kod należy wykonać pewne akcje przy użyciu tożsamości użytkownika wywołującego, zamiast SQL Server przetwarzanie tożsamości, a następnie token personifikacji powinny zostać uzyskane za pośrednictwem WindowsIdentity Właściwość SqlContext obiekt. The WindowsIdentity właściwość returns a WindowsIdentity wystąpienie representing the Microsoft Windows identity of the caller, or null if the klient was authenticated using SQL Server uwierzytelnianie. Tylko zestawy oznaczone EXTERNAL_ACCESS lub UNSAFE uprawnienia mogą uzyskać dostęp do tej właściwość.

Po uzyskaniu WindowsIdentity obiekt obiekty wywołujące może personifikować konto klient i wykonywania działań w ich imieniu.

Tożsamość obiektu wywołującego jest dostępna za pośrednictwem SqlContext.WindowsIdentity Jeżeli klient, który zainicjował wykonanie przechowywane procedury lub funkcja połączenie z serwerem przy użyciu uwierzytelnianie systemu Windows. Jeśli SQL Server Zamiast niej użyto uwierzytelnianie, ta właściwość ma wartość null i kod nie może dokonać personifikacji wywołującego.

Przykład

W poniższym przykładzie pokazano, jak uzyskać tożsamość klient wywołującego systemu Windows i personifikacji klient.

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