Compartilhar via


Objeto SqlContext

Você invoca o código gerenciado no servidor quando chama um procedimento ou função, quando chama um método em um tipo clr (common language runtime) definido pelo usuário ou quando sua ação dispara um gatilho definido em qualquer um dos idiomas do Microsoft .NET Framework. Como a execução desse código é exigida como parte de uma conexão de usuário, o acesso ao contexto do chamador a partir do código em execução no servidor é necessário. Além disso, determinadas operações de acesso a dados só poderão ser válidas se executadas no contexto do chamador. Por exemplo, o acesso a pseudotabelas inseridas e excluídas usadas em operações de gatilho será válido somente no contexto do chamador.

O contexto do chamador é abstraído em um objeto SqlContext. Para obter mais informações sobre os SqlTriggerContext métodos e as propriedades, consulte a Microsoft.SqlServer.Server.SqlTriggerContext documentação de referência de classe no SDK do .NET Framework.

SqlContext fornece acesso aos seguintes componentes:

  • SqlPipe: o SqlPipe objeto representa o "pipe" por meio do qual os resultados fluem para o cliente. Para obter mais informações sobre o SqlPipe objeto, consulte SqlPipe Object.

  • SqlTriggerContext: o SqlTriggerContext objeto só pode ser recuperado de dentro de um gatilho CLR. Ele fornece informações sobre a operação que fez o gatilho ser acionado e um mapa das colunas que foram atualizadas. Para obter mais informações sobre o SqlTriggerContext objeto, consulte SqlTriggerContext Object.

  • IsAvailable: a IsAvailable propriedade é usada para determinar a disponibilidade do contexto.

  • WindowsIdentity: a WindowsIdentity propriedade é usada para recuperar a identidade do Windows do chamador.

Determinando a disponibilidade do contexto

Consulte a SqlContext classe para ver se o código em execução no momento está em execução no processo. Para fazer isso, verifique a IsAvailable propriedade do SqlContext objeto. A propriedade IsAvailable é somente leitura e retorna True se o código de chamada estiver em execução dentro do SQL Server e se outros membros SqlContext puderem ser acessados. Se a propriedade IsAvailable retornar False, todos os outros membros SqlContext lançarão um InvalidOperationException, se usado. Se IsAvailable retornar False, qualquer tentativa de abrir um objeto de conexão que tenha "context connection=true" na cadeia de conexão falhará.

Recuperando a identidade do Windows

O código CLR em execução no SQL Server é sempre invocado no contexto da conta de processo. Se o código deve executar determinadas ações usando a identidade do usuário chamador, em vez da identidade do processo do SQL Server, um token de representação deverá ser obtido por meio da propriedade WindowsIdentity do objeto SqlContext. A WindowsIdentity propriedade retorna uma WindowsIdentity instância que representa a identidade do Microsoft Windows do chamador ou nula se o cliente foi autenticado usando a Autenticação do SQL Server. Somente assemblies marcados com permissões de EXTERNAL_ACCESS ou UNSAFE podem acessar essa propriedade.

Depois de obter o objeto, os WindowsIdentity chamadores podem representar a conta do cliente e executar ações em seu nome.

A identidade do chamador só estará disponível por meio de SqlContext.WindowsIdentity se o cliente que iniciou a execução do procedimento armazenado ou função conectada ao servidor usando a Autenticação do Windows. Se a Autenticação do SQL Server tiver sido usada, essa propriedade será nula e o código não poderá representar o chamador.

Exemplo

O exemplo a seguir mostra como obter a identidade do Windows do cliente que fez a chamada e representar o cliente.

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 Também

Objeto SqlPipe
Objeto SqlTriggerContext
Gatilhos CLR
O SQL Server In-Process extensões específicas para ADO.NET