Condividi tramite


MSSQLSERVER_17892

Si applica a:SQL Server

Dettagli

Attributo Valore
Nome prodotto SQL Server
ID evento 17892
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico SRV_LOGON_FAILED_BY_TRIGGER
Testo del messaggio Accesso non riuscito per il nome< di accesso >a causa dell'esecuzione del trigger.

Spiegazione

L'errore 17892 viene generato quando non è possibile eseguire correttamente il codice di un trigger di accesso. I trigger di accesso attivano stored procedure in risposta a un evento LOGON generato quando viene stabilita una sessione utente a un'istanza di SQL Server. All'utente viene segnalato il messaggio di errore seguente:

Messaggio 17892, Livello 14, Stato 1, Nome< server>, Riga 1
Accesso non riuscito per il nome< di accesso >a causa dell'esecuzione del trigger.

Possibili cause

Il problema può verificarsi se si verifica un errore durante l'esecuzione del codice del trigger per l'account utente specifico. Alcuni degli scenari includono:

  • Il trigger tenta di inserire dati in una tabella che non esiste.
  • L'account di accesso non ha le autorizzazioni per l'oggetto a cui fa riferimento il trigger di accesso.

Azione utente

A seconda dello scenario, è possibile usare una delle soluzioni seguenti:

  • Scenario 1: attualmente si ha accesso a una sessione aperta a SQL Server con un account amministratore

    In questo caso, è possibile eseguire l'azione correttiva necessaria per correggere il codice del trigger.

    • Esempio 1: se un oggetto a cui fa riferimento il codice del trigger non esiste, creare tale oggetto in modo che il trigger di accesso possa essere eseguito correttamente.

    • Esempio 2: se esiste un oggetto a cui fa riferimento il codice del trigger, ma gli utenti non dispongono delle autorizzazioni, concedere loro i privilegi necessari per accedere all'oggetto.

    In alternativa, è possibile eliminare o disabilitare il trigger di accesso in modo che gli utenti possano continuare ad accedere a SQL Server.

Gestire i trigger di accesso

Elencare tutti i trigger di accesso nel server:

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

Disabilitare temporaneamente un trigger di accesso senza eliminarlo:

DISABLE TRIGGER trigger_name ON ALL SERVER;

Eliminare (eliminare) un trigger di accesso in modo permanente:

DROP TRIGGER trigger_name ON ALL SERVER;

Per altre informazioni, vedere Gestire la sicurezza dei trigger.

  • Scenario 2: non è disponibile alcuna sessione corrente aperta con privilegi di amministratore, ma la connessione amministratore dedicato è abilitata in SQL Server.

    In questo caso, è possibile usare la connessione di applicazione livello dati per eseguire gli stessi passaggi descritti nello scenario 1. I trigger di accesso non influiscono sulle connessioni da applicazione livello dati. Per altre informazioni sulla connessione da applicazione livello dati, vedere Connessione di diagnostica per amministratori di database.

    Per verificare se l'applicazione livello dati è abilitata, esaminare il log degli errori di SQL Server. Cercare un messaggio simile a questo esempio:

    2020-02-09 16:17:44.150 Stabilito il supporto per le connessioni amministrative dedicate per l'attesa locale sulla porta 1434.

  • Scenario 3: l'applicazione livello dati non è abilitata nel server e non si dispone di una sessione di amministrazione esistente in SQL Server.

    In questo scenario, l'unico modo per risolvere il problema è eseguire i passaggi seguenti:

    1. Arrestare SQL Server e i servizi correlati.

    2. Avviare SQL Server dal prompt dei comandi usando i -cparametri di avvio , -me -f. Questa azione disabilita il trigger di accesso e consente di eseguire le stesse misure correttive descritte nello scenario 1.

      Nota

      Questa procedura richiede un account amministratore di sistema (SA) o un account amministratore equivalente.

      Per altre informazioni su queste e altre opzioni di avvio, vedere: motore di database Opzioni di avvio del servizio.

Ulteriori informazioni

I trigger di accesso possono anche non riuscire quando si usa la EVENTDATA funzione in modo non corretto. La EVENTDATA funzione restituisce XML e fa distinzione tra maiuscole e minuscole. Ad esempio, se si crea il trigger di accesso seguente per bloccare l'accesso in base all'indirizzo IP, potrebbe verificarsi l'errore 17892 se il percorso XML usa maiuscole e minuscole non corrette:

 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 non si mantiene la distinzione tra maiuscole e minuscole appropriate durante la copia di questo script, in particolare in questa parte del trigger, il trigger ha esito negativo:

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

Di conseguenza, EVENTDATA restituisce sempre NULL e tutti gli account di accesso equivalenti di sa vengono negati l'accesso. In questo caso, se la connessione dell'applicazione livello dati non è abilitata, è necessario riavviare il server con i parametri di avvio descritti in precedenza per eliminare il trigger.