Sdílet prostřednictvím


Objekt SqlContext

platí pro:SQL Server

Spravovaný kód na serveru vyvoláte při volání procedury nebo funkce, když voláte metodu pro common language runtime (CLR) uživatelem definovaný typ nebo když vaše akce aktivuje trigger definovaný v některém z jazyků rozhraní .NET Framework. Vzhledem k tomu, že spuštění tohoto kódu je požadováno jako součást připojení uživatele, je vyžadován přístup k kontextu volajícího z kódu spuštěného na serveru. Kromě toho můžou být určité operace přístupu k datům platné pouze v případě, že jsou spuštěny v kontextu volajícího. Například přístup k vloženým a odstraněným pseudo tabulkám používaným v operacích triggeru je platný pouze v kontextu volajícího.

Kontext volajícího je abstrahován v objektu SqlContext. Další informace naleznete v tématu Microsoft.SqlServer.Server.SqlContext.

SqlContext poskytuje přístup k následujícím komponentám.

Komponenta Popis
SqlPipe Tento objekt představuje potrubí, přes který tok výsledků do klienta. Další informace najdete v tématu objekt sqlPipe.
SqlTriggerContext Tento objekt lze načíst pouze z triggeru CLR. Poskytuje informace o operaci, která způsobila aktivaci triggeru, a mapu sloupců, které byly aktualizovány. Další informace naleznete v tématu SqlTriggerContext objekt.
IsAvailable Tato vlastnost slouží k určení dostupnosti kontextu.
WindowsIdentity Tato vlastnost slouží k načtení identity systému Windows volajícího.

Určení dostupnosti kontextu

Zadejte dotaz na SqlContext třídu, abyste zjistili, jestli aktuálně spuštěný kód běží v procesu. Zkontrolujte vlastnost IsAvailable objektu SqlContext. Vlastnost IsAvailable je určena jen pro čtení a vrací True, pokud je volající kód spuštěný uvnitř SQL Serveru a pokud je možné získat přístup k jiným SqlContext členům. Pokud IsAvailable vlastnost vrátí False, všechny ostatní členy SqlContext vyvolá InvalidOperationException, pokud se použije. Pokud IsAvailable vrátí False, jakýkoli pokus o otevření objektu připojení, který má v připojovacím řetězci hodnotu context connection=true, selže.

Načtení identity Systému Windows

Kód CLR, který se spouští uvnitř SQL Serveru, se vždy vyvolá v kontextu účtu procesu. Pokud by kód měl provádět určité akce pomocí identity volajícího uživatele místo identity procesu SQL Serveru, měl by být získán token zosobnění prostřednictvím WindowsIdentity vlastnosti objektu SqlContext. Vlastnost WindowsIdentity vrátí instanci WindowsIdentity představující identitu systému Windows volajícího nebo hodnotu null, pokud byl klient ověřen pomocí ověřování SYSTÉMU SQL Server. K této vlastnosti mají přístup pouze sestavení označená EXTERNAL_ACCESS nebo oprávněními UNSAFE.

Po získání objektu WindowsIdentity můžou volající zosobnit klientský účet a provádět akce jejich jménem.

Identita volajícího je k dispozici pouze prostřednictvím SqlContext.WindowsIdentity, pokud klient, který inicioval provádění uložené procedury nebo funkce připojené k serveru pomocí ověřování systému Windows. Pokud se místo toho použilo ověřování SQL Serveru, tato vlastnost má hodnotu null a kód nemůže zosobnit volajícího.

Příklad

Následující příklad ukazuje, jak získat identitu Systému Windows volajícího klienta a zosobnit 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;
    }
}