Megosztás a következőn keresztül:


SqlContext objektum

A következőkre vonatkozik:SQL Server

Felügyelt kódot hív meg a kiszolgálón, amikor meghív egy eljárást vagy függvényt, amikor metódust hív meg egy közös nyelvi futtatókörnyezet (CLR) felhasználó által definiált típuson, vagy amikor a művelet elindít egy , a .NET-keretrendszer bármely nyelvén definiált eseményindítót. Mivel a kód végrehajtását egy felhasználói kapcsolat részeként kéri a rendszer, a hívó környezetéhez való hozzáférés szükséges a kiszolgálón futó kódból. Ezenkívül bizonyos adathozzáférési műveletek csak akkor lehetnek érvényesek, ha a hívó környezetében futnak. Például az eseményindító műveletekben használt beszúrt és törölt pszeudotáblákhoz való hozzáférés csak a hívó kontextusában érvényes.

A hívó környezete egy SqlContext objektumban absztrakcióra kerül. További információ: Microsoft.SqlServer.Server.SqlContext.

SqlContext hozzáférést biztosít a következő összetevőkhöz.

Komponens Leírás
SqlPipe Ez az objektum azt a csöves jelöli, amelyen keresztül az eredmények az ügyfél felé haladnak. További információ: SqlPipe objektum.
SqlTriggerContext Ez az objektum csak EGY CLR-eseményindítóból kérhető le. Információt nyújt az eseményindítót kiváltó műveletről, valamint a frissített oszlopok térképéről. További információ: SqlTriggerContext objektum.
IsAvailable Ez a tulajdonság határozza meg a környezet rendelkezésre állását.
WindowsIdentity Ez a tulajdonság a hívó Windows-identitásának lekérésére szolgál.

A környezet rendelkezésre állásának meghatározása

A SqlContext osztály lekérdezésével ellenőrizze, hogy az éppen futó kód folyamatban van-e, és ellenőrizze a SqlContext objektum IsAvailable tulajdonságát. A IsAvailable tulajdonság írásvédett, és True ad vissza, ha a hívó kód az SQL Serveren belül fut, és hogy más SqlContext tagok is elérhetők-e. Ha a IsAvailable tulajdonság Falsead vissza, az összes többi SqlContext tag InvalidOperationExceptionad, ha használja. Ha IsAvailableFalsead vissza, a kapcsolati sztringben "context connection=true" értékű kapcsolatobjektum megnyitása sikertelen.

Windows-identitás lekérése

Az SQL Serveren belül végrehajtó CLR-kód mindig a folyamatfiók kontextusában lesz meghívva. Ha a kódnak bizonyos műveleteket a hívó felhasználó identitásával kell végrehajtania az SQL Server-folyamatidentitás helyett, akkor a megszemélyesítési jogkivonatot a SqlContext objektum WindowsIdentity tulajdonságán keresztül kell beszerezni. A WindowsIdentity tulajdonság egy WindowsIdentity példányt ad vissza, amely a hívó Windows-identitását jelöli, vagy null értéket, ha az ügyfél SQL Server-hitelesítéssel lett hitelesítve. Ezt a tulajdonságot csak EXTERNAL_ACCESS vagy UNSAFE engedélyekkel megjelölt szerelvények érhetik el.

A WindowsIdentity objektum beszerzése után a hívók megszemélyesíthetik az ügyfélfiókot, és műveleteket hajthatnak végre a nevükben.

A hívó identitása csak akkor érhető el SqlContext.WindowsIdentity keresztül, ha az ügyfél kezdeményezte a windowsos hitelesítéssel a kiszolgálóhoz csatlakoztatott tárolt eljárás vagy függvény végrehajtását. Ha ehelyett SQL Server-hitelesítést használtak, ez a tulajdonság null értékű, és a kód nem tudja megszemélyesíteni a hívót.

Példa

Az alábbi példa bemutatja, hogyan szerezheti be a hívó ügyfél Windows-identitását, és hogyan adhatja meg az ügyfelet.

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