Partilhar via


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 logon <Nome> 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 é gerado quando uma sessão de usuário é estabelecida 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 do Servidor<>, Linha 1
Falha no logon para logon <Nome> 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 para o 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 referido pelo código do gatilho não existir, crie esse objeto para que o gatilho de login possa ser executado com êxito.

    • Exemplo 2: Se um objeto referido 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 simplesmente descartar ou desabilitar o gatilho de logon para que os usuários possam continuar a fazer 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, consulte: Conexão de diagnóstico para administradores de banco de dados.

    Para verificar se o DAC está habilitado no SQL Server, você pode verificar o log de erros do SQL Server para obter 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 em seu servidor nem tem uma sessão de administrador existente para SQL Server.

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

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

    2. Inicie o SQL Server no prompt de comando usando os parâmetros -cde inicialização , -me -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, consulte: Opções de inicialização do serviço 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 o intuito de bloquear o acesso baseado no endereço IP, e poderá ter este 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.