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:
Pare o SQL Server e os serviços relacionados.
Inicie o SQL Server no prompt de comando usando os parâmetros
-c
de inicialização ,-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, 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.