Udostępnij za pośrednictwem


SqlContext, obiekt

Dotyczy:programu SQL Server

Kod zarządzany wywoływany na serwerze jest wywoływany podczas wywoływania procedury lub funkcji podczas wywoływania metody w typie środowiska uruchomieniowego języka wspólnego (CLR) lub gdy akcja uruchamia wyzwalacz zdefiniowany w dowolnych językach programu .NET Framework. Ponieważ wykonanie tego kodu jest wymagane w ramach połączenia użytkownika, wymagany jest dostęp do kontekstu obiektu wywołującego z kodu uruchomionego na serwerze. Ponadto niektóre operacje dostępu do danych mogą być prawidłowe tylko w przypadku uruchomienia w kontekście obiektu wywołującego. Na przykład dostęp do wstawionych i usuniętych pseudo-tabel używanych w operacjach wyzwalacza jest prawidłowy tylko w kontekście obiektu wywołującego.

Kontekst obiektu wywołującego jest abstrakcyjny w obiekcie SqlContext. Aby uzyskać więcej informacji, zobacz Microsoft.SqlServer.Server.SqlContext.

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

Składnik Opis
SqlPipe Ten obiekt reprezentuje potok , za pomocą którego wyniki przepływają do klienta. Aby uzyskać więcej informacji, zobacz obiekt SqlPipe.
SqlTriggerContext Ten obiekt można pobrać tylko z wyzwalacza CLR. Zawiera informacje o operacji, która spowodowała wyzwolenie wyzwalacza, oraz mapę zaktualizowanych kolumn. Aby uzyskać więcej informacji, zobacz sqlTriggerContext object.
IsAvailable Ta właściwość służy do określania dostępności kontekstu.
WindowsIdentity Ta właściwość służy do pobierania tożsamości systemu Windows obiektu wywołującego.

Określanie dostępności kontekstu

Wykonaj zapytanie względem klasy SqlContext, aby sprawdzić, czy aktualnie wykonywany kod jest uruchomiony w procesie, sprawdzając właściwość IsAvailable obiektu SqlContext. Właściwość IsAvailable jest tylko do odczytu i zwraca True, jeśli kod wywołujący jest uruchomiony w programie SQL Server i czy można uzyskać dostęp do innych SqlContext elementów członkowskich. Jeśli właściwość IsAvailable zwraca wartość False, wszystkie pozostałe elementy członkowskie SqlContext zgłaszają InvalidOperationException, jeśli są używane. Jeśli IsAvailable zwraca False, każda próba otwarcia obiektu połączenia, który ma wartość "context connection=true" w parametrach połączenia, zakończy się niepowodzeniem.

Pobieranie tożsamości systemu Windows

Kod CLR wykonywany wewnątrz programu SQL Server jest zawsze wywoływany w kontekście konta procesu. Jeśli kod powinien wykonywać pewne akcje przy użyciu tożsamości użytkownika wywołującego, zamiast tożsamości procesu programu SQL Server, należy uzyskać token personifikacji za pomocą właściwości WindowsIdentity obiektu SqlContext. Właściwość WindowsIdentity zwraca wystąpienie WindowsIdentity reprezentujące tożsamość systemu Windows obiektu wywołującego lub wartość null, jeśli klient został uwierzytelniony przy użyciu uwierzytelniania programu SQL Server. Tylko zestawy oznaczone EXTERNAL_ACCESS lub uprawnienia UNSAFE mogą uzyskiwać dostęp do tej właściwości.

Po uzyskaniu obiektu WindowsIdentity osoby wywołujące mogą personifikować konto klienta i wykonywać akcje w ich imieniu.

Tożsamość obiektu wywołującego jest dostępna tylko za pośrednictwem SqlContext.WindowsIdentity, jeśli klient, który zainicjował wykonywanie procedury składowanej lub funkcji połączonej z serwerem przy użyciu uwierzytelniania systemu Windows. Jeśli zamiast tego użyto uwierzytelniania programu SQL Server, ta właściwość ma wartość null, a kod nie może personifikować obiektu wywołującego.

Przykład

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

[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;
    }
}