MSSQLSERVER_17892

Aplica-se a:SQL Server

Detalhes

Atributo Valor
Nome do Produto SQL Server
ID do evento 17892
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico SRV_LOGON_FAILED_BY_TRIGGER
Texto da mensagem Falha no logon para o Nome> de Logon de logon <devido à execução do gatilho.

Explicação

O erro 17892 é gerado quando um código de gatilho de logon não pode ser executado com êxito. Os gatilhos de logon acionam procedimentos armazenados em resposta a um evento LOGON. Esse evento ocorre quando é estabelecida uma sessão de usuário com uma instância do SQL Server. Uma mensagem de erro semelhante à seguinte é relatada ao usuário:

Msg 17892, Nível 14, Estado 1, Nome> do Servidor<, Linha 1
Falha no logon para o Nome> de Logon de logon <devido à execução do gatilho.

Possíveis causas

O problema poderá ocorrer se houver um erro ao executar o código de gatilho para essa conta de usuário específica. Alguns dos cenários incluem:

  • O gatilho tenta inserir dados em uma tabela que não existe.
  • O logon não tem permissões no objeto referenciado pelo gatilho de logon.

Ação do usuário

Use uma das resoluções abaixo, dependendo do cenário.

  • Cenário 1: No momento, você tem acesso a uma sessão aberta do SQL Server em uma conta de administrador

    Nesse caso, você pode executar a ação corretiva necessária para corrigir o código do gatilho.

    • Exemplo 1: Se um objeto referenciado pelo código do gatilho não existir, crie esse objeto para que o gatilho de logon possa ser executado com êxito.

    • Exemplo 2: Se um objeto referenciado pelo código de gatilho existir, mas os usuários não tiverem permissões, conceda a eles os privilégios necessários para acessar o objeto.

    Como alternativa, você pode apenas remover ou desabilitar o gatilho de logon, de modo que os usuários possam continuar fazendo logon no SQL Server.

  • Cenário 2: Você não tem nenhuma sessão atual aberta com privilégios de administrador, mas a DAC (Conexão de Administrador Dedicada) está habilitada no SQL Server.

    Nesse caso, você pode usar a conexão DAC para executar as mesmas etapas, conforme discutido no Caso 1, pois as conexões DAC não são afetadas pelos gatilhos de logon. Para obter mais informações sobre a conexão DAC, confira: Conexão de diagnóstico para administradores de banco de dados.

    Para verificar se o DAC está habilitado no SQL Server, veja no log de erros do SQL Server se há uma mensagem semelhante à seguinte:

    09/02/2020 16:17:44.150 Foi estabelecido suporte para conexão de administrador Dedicado do Servidor para escuta local na porta 1434.

  • Cenário 3: Você não tem o DAC habilitado no servidor nem tem uma sessão de administrador existente do SQL Server.

    Nesse cenário, a única maneira de corrigir o problema é executar as seguintes etapas:

    1. Interrompa o SQL Server e os serviços relacionados.

    2. Inicie o SQL Server no prompt de comando usando os parâmetros de inicialização -c, -m e -f. Essa ação desabilita o gatilho de logon e permite tomar as mesmas medidas corretivas discutidas no Caso 1 acima.

      Observação

      O procedimento descrito acima exige uma SA ou uma conta de administrador equivalente.

      Para obter mais informações sobre essas e outras opções de inicialização, confira: Opções de Inicialização do Serviço de Mecanismo de Banco de Dados.

Mais informações

Outra situação em que ocorre uma falha nos gatilhos de logon é quando a função EVENTDATA é usada. Essa função retorna um XML e diferencia maiúsculas de minúsculas.  Portanto, você cria o seguinte gatilho de logon, com a intenção de bloquear o acesso com base no endereço IP, esbarrou no problema:

 CREATE TRIGGER tr_logon_CheckIP  
 ON ALL SERVER  
 FOR LOGON  
 AS
 BEGIN
  IF IS_SRVROLEMEMBER ( 'sysadmin' ) = 1  
     BEGIN
         DECLARE @IP NVARCHAR ( 15 );  
         SET @IP = ( SELECT EVENTDATA ().value ( '(/EVENT_INSTANCE/ClientHost)[1]' , 'NVARCHAR(15)' ));  
         IF NOT EXISTS( SELECT IP FROM DBAWork.dbo.ValidIP WHERE IP = @IP )  
         ROLLBACK ;  
     END ;  
 END ;  
 GO

O usuário não manteve o uso de maiúsculas e minúsculas ao copiar este script da Internet nesta parte do gatilho:

 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

Como consequência, EVENTDATA sempre retornava NULL e todos os logons de SA equivalentes tiveram o acesso negado. Nesse caso, a conexão DAC não foi habilitada e, portanto, não tínhamos escolha a não ser reiniciar o servidor com os parâmetros de inicialização listados acima para remover o gatilho.