Partager via


MSSQLSERVER_17892

S’applique à :SQL Server

Détails

Attribut Valeur
Nom du produit SQL Server
ID de l’événement 17892
Source de l’événement MSSQLSERVER
Composant SQLEngine
Nom symbolique SRV_LOGON_FAILED_BY_TRIGGER
Texte du message Échec de l’ouverture de session pour nom> de connexion <en raison de l’exécution du déclencheur.

Explication

L’erreur 17892 est générée lorsque le code d’un déclencheur LOGON ne peut pas s’exécuter correctement. Les déclencheurs LOGON lancent des procédures stockées en réponse à un événement LOGON. Cet événement est déclenché lorsqu'une session utilisateur est établie avec une instance de SQL Server. Un message d’erreur semblable au suivant s’affiche :

Message 17892, niveau 14, état 1, <nom du> serveur, ligne 1
Échec de l’ouverture de session pour nom> de connexion <en raison de l’exécution du déclencheur.

Causes possibles

Le problème peut se produire en cas d’erreur lors de l’exécution du code de déclencheur pour ce compte d’utilisateur. Voici certains des scénarios possibles :

  • Le déclencheur tente d’insérer des données dans une table qui n’existe pas.
  • Le nom d’utilisateur (login) n’a pas d’autorisations sur l’objet qui est référencé par le déclencheur LOGON.

Action requise

Vous pouvez utiliser l’une des solutions ci-dessous en fonction de votre scénario.

  • Scenario 1 : Vous avez actuellement accès à une session ouverte dans SQL Server sous un compte d’administrateur.

    Dans ce cas, vous pouvez apporter la correction nécessaire pour corriger le code de votre déclencheur.

    • Exemple 1 : S’il n’existe pas d’objet référencé par le code du déclencheur, créez-en un afin que le déclencheur LOGIN puisse s’exécuter correctement.

    • Exemple 2 : S’il existe un objet référencé par le code du déclencheur, mais que les utilisateurs n’ont pas d’autorisations, accordez-leur les privilèges nécessaires pour accéder à l’objet.

    Vous pouvez également supprimer ou désactiver le déclencheur LOGIN afin que les utilisateurs puissent continuer à se connecter à SQL Server.

  • Scénario 2 : Aucune session active n’est ouverte avec des privilèges d’administrateur, mais une connexion administrateur dédiée (DAC) est activée dans SQL Server.

    Dans ce cas, vous pouvez utiliser la connexion DAC pour effectuer les mêmes étapes que celles décrites dans le cas 1, car les connexions DAC ne sont pas affectées par les déclencheurs LOGIN. Pour plus d’informations sur les connexions DAC, consultez : Connexion de diagnostic pour les administrateurs de base de données.

    Pour vérifier si la connexion DAC est activée dans SQL Server, vous pouvez rechercher dans le journal des erreurs SQL Server un message similaire à celui-ci :

    2020-02-09 16:17:44.150 La prise en charge de connexion administrateur dédiée a été établie pour l’écoute locale sur le port 1434.

  • Scénario 3 : La connexion DAC n’est pas activée sur votre serveur et vous ne disposez pas d’une session administrateur existante pour SQL Server.

    Dans ce scénario, le seul moyen de résoudre le problème consiste à effectuer les étapes suivantes :

    1. Arrêtez SQL Server et les services connexes.

    2. Démarrez SQL Server à partir de l’invite de commandes, à l’aide des paramètres de démarrage -c, -m et -f. Cela désactive le déclencheur LOGIN et vous permet d’appliquer les mêmes mesures correctives présentées dans le Cas 1 ci-dessus.

      Notes

      La procédure ci-dessus nécessite un compte Administrateur système ou un compte Administrateur équivalent.

      Pour plus d’informations sur ces comptes et sur les autres options de démarrage, consultez : Options de démarrage du service moteur de base de données.

Informations complémentaires

Une autre situation dans laquelle les déclencheurs LOGON échouent est lorsque vous utilisez la fonction EVENTDATA. Cette fonction retourne du code XML et respecte la casse.  Ainsi, vous créez le déclencheur d’ouverture de session suivant, dans l’intention de bloquer l’accès en fonction de l’adresse IP, vous pouvez rencontré le problème :

 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’utilisateur n’a pas respecté la casse lorsqu’il a copié ce script à partir d’Internet dans cette partie du déclencheur :

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

Par conséquent, EVENTDATA a toujours retourné NULL, et toutes ses connexions d’administrateur système équivalentes se sont vu refuser l’accès. Dans ce cas, la connexion DAC n’a pas été activée. Nous avons donc été obligés de redémarrer le serveur avec les paramètres de démarrage listés ci-dessus afin de supprimer le déclencheur.