Objeto SqlContext
Aplica-se a:SQL Server
Você invoca código gerenciado no servidor quando chama um procedimento ou função, quando chama um método em um tipo definido pelo usuário CLR (Common Language Runtime) ou quando sua ação dispara um gatilho definido em qualquer uma das linguagens do .NET Framework. Como a execução desse código é solicitada 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ó podem 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 só é válido no contexto do chamador.
O contexto do chamador é abstraído em um objeto SqlContext
. Para obter mais informações, consulte Microsoft.SqlServer.Server.SqlContext.
SqlContext
fornece acesso aos seguintes componentes.
Componente | Descrição |
---|---|
SqlPipe |
Este objeto representa o de pipe de |
SqlTriggerContext |
Este objeto só pode ser recuperado de dentro de um gatilho CLR. Ele fornece informações sobre a operação que causou o disparo do gatilho e um mapa das colunas que foram atualizadas. Para obter mais informações, consulte objeto SqlTriggerContext. |
IsAvailable |
Esta propriedade é usada para determinar a disponibilidade do contexto. |
WindowsIdentity |
Esta propriedade é usada para recuperar a identidade do Windows do chamador. |
Determinar a disponibilidade do contexto
Consulte a classe SqlContext
para ver se o código em execução está sendo executado no processo, verificando a propriedade IsAvailable
do objeto SqlContext
. A propriedade IsAvailable
é somente leitura e retorna True
se o código de chamada estiver sendo executado dentro do SQL Server e se outros membros do SqlContext
puderem ser acessados. Se a propriedade IsAvailable
retornar False
, todos os outros membros da SqlContext
lançarão uma InvalidOperationException
, se usada. Se IsAvailable
retornar False
, qualquer tentativa de abrir um objeto de conexão que tenha "context connection=true" na cadeia de conexão falhará.
Recuperar identidade do Windows
O código CLR executado dentro do 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 deve ser obtido por meio da propriedade WindowsIdentity
do objeto SqlContext
. A propriedade WindowsIdentity
retorna uma instância WindowsIdentity
que representa a identidade do Windows do chamador, ou null se o cliente foi autenticado usando a Autenticação do SQL Server. Somente assemblies marcados com permissões EXTERNAL_ACCESS
ou UNSAFE
podem acessar essa propriedade.
Depois de obter o objeto WindowsIdentity
, os chamadores podem se passar pela conta do cliente e executar ações em seu nome.
A identidade do chamador só está disponível através de SqlContext.WindowsIdentity
se o cliente que iniciou a execução do procedimento armazenado ou função se conectou ao servidor usando a Autenticação do Windows. Se a Autenticação do SQL Server tiver sido usada em vez disso, 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 chamador e representar o cliente.
[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;
}
}