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 podem ser válidas somente 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 documentação de referência de Microsoft.SqlServer.Server.SqlTriggerContext
classe no SDK do .NET Framework.
SqlContext
fornece acesso aos seguintes componentes:
SqlPipe
: o objetoSqlPipe
representa o "pipe" pelo qual os resultados fluem para o cliente. Para obter mais informações sobre oSqlPipe
objeto , consulte SqlPipe Object.SqlTriggerContext
: o objetoSqlTriggerContext
pode ser recuperado somente de dentro 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 oSqlTriggerContext
objeto , consulte Objeto SqlTriggerContext.IsAvailable
: a propriedadeIsAvailable
é usada para determinar a disponibilidade de contexto.WindowsIdentity
: a propriedadeWindowsIdentity
é usada para recuperar a identidade do Windows do chamador.
Determinando a disponibilidade de contexto
Consulte a classe SqlContext
para ver se o código em execução no momento está sendo executado em processo. Para fazer isso, verifique a propriedade IsAvailable
do objeto SqlContext
. A IsAvailable
propriedade é somente leitura e retorna True
se o código de chamada está em execução dentro de SQL Server e se outros SqlContext
membros podem ser acessados. Se a propriedade IsAvailable
retornar False
, todos os outros membros de SqlContext
lançarão um InvalidOperationException
, se usado. Se IsAvailable
retornar False
, qualquer tentativa de abrir um objeto de conexão que tem "context connection=true" na cadeia de conexão falhará.
Recuperando a identidade do Windows
O código CLR em execução dentro 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 que está chamando, em vez da identidade do processo SQL Server, um token de representação deve ser obtido por meio da WindowsIdentity
propriedade do SqlContext
objeto . 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 SQL Server Autenticação. Outros assemblies marcados com EXTERNAL_ACCESS
ou permissões UNSAFE
podem acessar esta propriedade.
Depois de obter o objeto WindowsIdentity
, os chamadores podem representar a conta de cliente e executar ações em seu nome.
A identidade do chamador está disponível por meio de SqlContext.WindowsIdentity
somente se o cliente que iniciou a execução do procedimento armazenado ou da função se conectou ao servidor usando a Autenticação do Windows. Se SQL Server Autenticação 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 de CLR
Extensões específicas em processo do SQL Server para o ADO.NET