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 le 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 :

Msg 17892, Level 14, State 1, Server Server <Name>, Line 1
Échec de l’ouverture de session pour le 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 utilisateur

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

  • Scénario 1 : Vous avez actuellement accès à une session ouverte à 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 : Si un objet référencé par le code du déclencheur n’existe pas, créez cet objet afin que le déclencheur de connexion puisse s’exécuter correctement.

    • Exemple 2 : Si un objet référencé par le code de déclencheur existe 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 de connexion afin que les utilisateurs puissent continuer à se connecter à SQL Server.

  • Scénario 2 : Vous n’avez pas de session active ouverte sous privilèges d’administrateur, mais la connexion d’administrateur dédiée (DAC) est activée sur 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 la connexion DAC, consultez : Connexion de diagnostic pour les administrateurs de base de données.

    Pour vérifier si la DAC est activée sur votre serveur SQL Server, vous pouvez vérifier le journal des erreurs SQL Server pour obtenir un message similaire à ce qui suit :

    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 : Vous n’avez pas activé la DAC sur votre serveur ni que vous disposez d’une session d’administration existante sur 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 associés.

    2. Démarrez SQL Server à partir de l’invite de commandes à l’aide des paramètres -cde démarrage, -met -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.

      Remarque

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

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

Plus d’informations

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. Si vous créez le déclencheur LOGON suivant, avec l’intention de bloquer l’accès en fonction de l’adresse IP, vous pouvez rencontrer le problème suivant :

 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.