Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Detalhes
| Atributo | Valor |
|---|---|
| Nome do Produto | Servidor SQL |
| 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. Uma mensagem de erro como a seguinte é relatada ao usuário:
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
Você pode usar uma das resoluções abaixo, dependendo do cenário em que se encontra.
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.
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.
Nesse caso, você pode usar a conexão de DAC para executar as mesmas etapas discutidas no Caso 1, uma vez que as conexões de DAC não são afetadas por gatilhos de login. 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á habilitado no SQL Server, você pode verificar o log de erros do SQL Server em busca de uma mensagem semelhante à seguinte:
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: Você não tem o DAC habilitado no servidor nem tem uma sessão de administração existente para o SQL Server.
Nesse cenário, a única maneira de remediar o problema seria executar as seguintes etapas:
Pare o SQL Server e serviços relacionados.
Inicie o SQL Server a partir do prompt de comando usando os parâmetros
-cde inicialização ,-me-f. Fazer isso desativa o gatilho de login e permite que você execute as mesmas medidas corretivas que são discutidas no Caso 1 acima.Observação
O procedimento acima requer 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 os gatilhos de logon falham é ao usar a EVENTDATA função. Essa função retorna XML e diferencia maiúsculas de minúsculas. Assim, você cria o seguinte gatilho de logon, com a intenção de bloquear o acesso com base no endereço IP, você pode se deparar com o 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 caso ao copiar este script da internet nesta parte do gatilho:
SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');
Como consequência, EVENTDATA sempre retornavam NULL, e todos os seus logins equivalentes SA tinham acesso negado. Nesse caso, a conexão DAC não estava habilitada, então não tivemos escolha a não ser reiniciar o servidor com os parâmetros de inicialização listados acima para soltar o gatilho.