Compartir a través de


Objeto SqlContext

Se aplica a: SQL Server

Se invoca código administrado en el servidor cuando se llama a un procedimiento o función, cuando se llama a un método en un tipo definido por el usuario de Common Language Runtime (CLR), o cuando la acción desencadena un desencadenador definido en cualquiera de los lenguajes de Microsoft .NET Framework. Dado que la ejecución de este código se solicita como parte de una conexión de usuario, se requiere el acceso al contexto del autor de la llamada desde el código que se ejecuta en el servidor. Además, ciertas operaciones de acceso a datos solo pueden ser válidas si se ejecutan bajo el contexto del autor de la llamada. Por ejemplo, el acceso a pseudo tablas insertadas y eliminadas utilizadas en operaciones del desencadenador solo es válido bajo el contexto del autor de la llamada.

El contexto del autor de la llamada se abstrae en un objeto SqlContext . Para obtener más información sobre los métodos y propiedades sqlTriggerContext , consulte la documentación de referencia de la clase Microsoft.SqlServer.Server.SqlTriggerContext en el SDK de .NET Framework.

SqlContext proporciona acceso a los siguientes componentes:

  • SqlPipe: el objeto SqlPipe representa la "canalización" a través de la cual los resultados fluyen al cliente. Para obtener más información sobre el objeto SqlPipe , vea Objeto SqlPipe.

  • SqlTriggerContext: el objeto SqlTriggerContext solo se puede recuperar desde dentro de un desencadenador CLR. Proporciona información sobre la operación que hizo que se activara el desencadenador y un mapa de las columnas actualizadas. Para obtener más información sobre el objeto SqlTriggerContext , vea Objeto SqlTriggerContext.

  • IsAvailable: la propiedad IsAvailable se usa para determinar la disponibilidad del contexto.

  • WindowsIdentity: la propiedad WindowsIdentity se usa para recuperar la identidad de Windows del autor de la llamada.

Determinar la disponibilidad del contexto

Consulte la clase SqlContext para ver si el código que se está ejecutando actualmente se está ejecutando en proceso. Para ello, compruebe la propiedad IsAvailable del objeto SqlContext . La propiedad IsAvailable es de solo lectura y devuelve True si el código de llamada se ejecuta dentro de SQL Server y si se puede acceder a otros miembros de SqlContext . Si la propiedad IsAvailable devuelve False, todos los demás miembros de SqlContext inician una excepción InvalidOperationException, si se usa. Si IsAvailable devuelve False, se produce un error en cualquier intento de abrir un objeto de conexión que tenga "context connection=true" en el cadena de conexión.

Recuperar la identidad de Windows

El código CLR que se ejecuta dentro de SQL Server siempre se invoca en el contexto de la cuenta de proceso. Si el código debe realizar determinadas acciones mediante la identidad del usuario que realiza la llamada, en lugar de la identidad del proceso de SQL Server, se debe obtener un token de suplantación a través de la propiedad WindowsIdentity del objeto SqlContext . La propiedad WindowsIdentity devuelve una instancia de WindowsIdentity que representa la identidad de Microsoft Windows del autor de la llamada o null si el cliente se autenticó mediante la autenticación de SQL Server. Solo los ensamblados marcados con permisos EXTERNAL_ACCESS o UNSAFE pueden acceder a esta propiedad.

Después de obtener el objeto WindowsIdentity , los autores de llamadas pueden suplantar la cuenta de cliente y realizar acciones en su nombre.

La identidad del autor de la llamada solo está disponible a través de SqlContext.WindowsIdentity si el cliente que inició la ejecución del procedimiento almacenado o la función conectada al servidor mediante la autenticación de Windows. Si se usó la autenticación de SQL Server en su lugar, esta propiedad es null y el código no puede suplantar al autor de la llamada.

Ejemplo

En el ejemplo siguiente, se muestra cómo obtener la identidad de Windows del cliente de la llamada y suplantarla.

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  

Consulte también

Objeto SqlPipe
Objeto SqlTriggerContext
Desencadenadores de CLR
Extensiones específicas en proceso de SQL Server a ADO.NET