Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
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. 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.