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. Viene segnalato all'utente un messaggio di errore simile al 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

È possibile usare una delle soluzioni riportate di seguito in base allo scenario.

  • 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.

  • 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 DAC per eseguire gli stessi passaggi illustrati nel caso 1 perché le connessioni DAC non sono interessate dai trigger di accesso. 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 in SQL Server, è possibile controllare il log degli errori di SQL Server per un messaggio simile al seguente:

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

  • Scenario 3: nel server non è abilitata alcuna applicazione livello dati né è disponibile una sessione di amministrazione esistente per 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. Viene così disabilitato il trigger di accesso ed è possibile applicare le stesse misure correttive descritte nel caso 1 in precedenza.

      Nota

      Per la procedura precedente è necessario un account 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

Un'altra situazione in cui i trigger di accesso causano errori è quando si usa la funzione EVENTDATA. Questa funzione restituisce codice XML e fa distinzione tra maiuscole e minuscole. Quindi, se si crea il trigger di accesso seguente con l'intento di bloccare l'accesso in base all'indirizzo IP, è possibile che si riscontri il 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

L'utente non ha rispettato la combinazione di maiuscole/minuscole durante la copia di questo script da Internet in questa parte del trigger:

 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

Di conseguenza, EVENTDATA ha restituito sempre NULL e l'accesso è stato negato a tutti gli account di accesso di SA equivalenti. In questo caso, la connessione DAC non era stata abilitata, quindi l'unica scelta era riavviare il server con i parametri di avvio elencati sopra per eliminare il trigger.