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 de logon para login <Nome> de login 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 disparam 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. A seguinte mensagem de erro é reportada ao utilizador:

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

Causas possíveis

O problema pode 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 para o objeto que é referido pelo gatilho de logon.

Ação do usuário

Pode usar uma das seguintes resoluções dependendo do seu cenário:

  • Cenário 1: Você atualmente tem acesso a uma sessão aberta para o SQL Server em uma conta de administrador

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

    • Exemplo 1: Se um objeto referido pelo código de 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-lhes os privilégios necessários para acessar o objeto.

    Como alternativa, você pode simplesmente soltar ou desabilitar o gatilho de logon para que os usuários possam continuar a fazer logon no SQL Server.

Gerir gatilhos de início de sessão

Liste todos os gatilhos de login no seu servidor:

SELECT name, is_disabled, create_date, modify_date
FROM sys.server_triggers
WHERE type_desc = 'LOGON';

Desative temporariamente um gatilho de login sem o apagar:

DISABLE TRIGGER trigger_name ON ALL SERVER;

Cancelar (eliminar) permanentemente um gatilho de logon:

DROP TRIGGER trigger_name ON ALL SERVER;

Para mais informações, consulte Gerir a segurança dos gatilhos.

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

    Neste caso, pode usar a ligação do DAC para seguir os mesmos passos descritos no Cenário 1. Os gatilhos de login não afetam as ligações do DAC. Para obter mais informações sobre a conexão de DAC, consulte: Conexão de diagnóstico para administradores de banco de dados.

    Para verificar se o DAC está ativado, consulte o registo de erros do SQL Server. Procure uma mensagem semelhante a este exemplo:

    2020-02-09 16:17:44.150 O suporte de conexão de administrador dedicado do servidor foi estabelecido para ouvir localmente na porta 1434.

  • Cenário 3: O DAC não está ativado no teu servidor e não tens uma sessão de administração existente no SQL Server.

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

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

    2. Inicie o SQL Server a partir do prompt de comando usando os parâmetros -cde inicialização , -me -f. Esta ação desativa o gatilho de login e permite-lhe realizar as mesmas medidas corretivas descritas no Cenário 1.

      Observação

      Este procedimento requer uma conta de administrador de sistema (SA) ou 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

Os gatilhos de início de sessão também podem falhar quando a função é usada EVENTDATA incorretamente. A EVENTDATA função devolve XML e é sensível a maiúsculas minúsculas. Por exemplo, se criar o seguinte gatilho de login para bloquear o acesso com base no endereço IP, poderá encontrar o erro 17892 se o caminho XML usar maiúsculas incorretas:

 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

Se não mantiveres a sensibilidade adequada a maiúsculas minúsculas ao copiar este script, especificamente nesta parte do trigger, o trigger falha:

-- Incorrect: lowercase 'event_instance' and 'clienthost' will cause EVENTDATA to return NULL
 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

Como consequência, EVENTDATA devolve sempre NULL, e todos os logins equivalentes SA são recusados de acesso. Neste caso, se a ligação ao DAC não estiver ativada, é necessário reiniciar o servidor com os parâmetros de arranque descritos anteriormente para desativar o trigger.