Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
Arrestare SQL Server e i servizi correlati.
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.