[SQL Server] SQL SERVER – Fix : Error : 17892 Logon failed for login due to trigger execution. Changed database context to ‘master’.

Recréons le scénario d'abord et essayons de résoudre le problème.

/* Create Audit Database */

CREATE DATABASE AuditDb

GO

USE AuditDb

GO

/* Create Audit Table */

CREATE TABLE ServerLogonHistory

(SystemUser VARCHAR(512),

DBUser VARCHAR(512),

SPID INT,

LogonTime DATETIME)

GO

/* Create Logon Trigger */

CREATE TRIGGER Tr_ServerLogon

ON ALL SERVER FOR LOGON

AS

BEGIN

INSERT INTO AuditDb.dbo.ServerLogonHistory

SELECT SYSTEM_USER,USER,@@SPID,GETDATE()

END

GO

/* Dropping Database AuditDB */

/* Please note login to Server again will

Produce Errors */

USE master

GO

DROP DATABASE AuditDB

GO

Une fois la base de données abandonnée et vous essayez de se connecter à nouveau, l'erreur suivante s'affiche.

L'ouverture de session a échoué pour la connexion 'SQL \ Pinal' en raison de l'exécution du déclencheur. 
Changé le contexte de la base de données sur «master». 
Modification du paramètre de langue pour nous. (Microsoft SQL Server, Erreur: 17892)

Cette erreur aurait pu être évitée si le déclencheur a été supprimé avant de quitter la base de données.

USE master

GO

DROP TRIGGER Tr_ServerLogon ON ALL SERVER

GO

Maintenant, il ne sera pas possible d'ouvrir une session sur la base de données à l'aide de SQL Server Management Studio. La seule façon de résoudre ce problème est l'utilisation de DAC. Lisez plus de détails sur le DAC à l'  aide d'une connexion dédiée aux administrateurs dédiés à Kill Current Running Query . Permettez-nous d'examiner l'exemple dans notre cas où j'utilise l'authentification Windows pour me connecter au système.

1-    Démarrer le serveur en mode mono utilisateur (ajouter –m dans le service et redémarrer le serveur)

2-    Se connecter à SQL Server via sqlcmd :

C: \Users\Zouhaier> sqlcmd -S LocalHost -d master -A

3-    Afficher la liste des triggers :

C:\Users\zouhaier>sqlcmd -S LocalHost -d master -A

 SELECT

SSM.definition

FROM

sys.server_triggers AS ST JOIN

sys.server_sql_modules AS SSM

ON ST.object_id = SSM.object_id

go

4-    Supprimer le trigger concerné :

C: \Users\Zouhaier> sqlcmd -S LocalHost -d master -A

1> DROP TRIGGER Tr_ServerLogon ON ALL SERVER

2> GO