2010-12-14 56 views
2

J'ai un déclencheur de connexion au serveur SQL pour auditer les connexions.Comment supprimer une condition d'erreur dans un déclencheur de connexion au serveur SQL?

Je souhaite supprimer les erreurs renvoyées, car une erreur empêche la connexion.

Comment faire cela?

Voici mon code de déclenchement

CREATE TRIGGER [trigLogon_Audit] 
ON ALL SERVER 
FOR LOGON 
AS 
    BEGIN 
     IF (IS_MEMBER('dbo') = 1) RETURN; 
     INSERT INTO Tracking.dbo.Activity (moment, name) VALUES (GETDATE(), ORIGINAL_LOGIN()); 

    END; 
GO 

ENABLE TRIGGER [trigLogon_Audit] ON ALL SERVER 
GO 

Répondre

1

Vous pouvez avoir le code de gestion des erreurs dans un déclencheur, mais vous ne pouvez pas faire grand-chose parce que lorsqu'une erreur se produit dans un déclencheur du lot est interrompu (à moins que vous soulevez l'erreur vous en utilisant RAISERROR).

Deux bons articles sur le traitement des erreurs par Erland Sommarskog:

http://www.sommarskog.se/error-handling-I.html

http://www.sommarskog.se/error-handling-II.html

+0

Ces articles concernent SQL Server 2000. Existe-t-il une solution pour SQL Server 2008? Je ne peux pas croire qu'une telle chose simple est impossible sur le langage de programmation moderne. – meir

1

Vous pouvez avaler l'erreur silencieuse à l'aide try/catch

CREATE TRIGGER [trigLogon_Audit] 
ON ALL SERVER 
FOR LOGON 
AS 
SET NOCOUNT ON 
BEGIN TRY 
    IF (IS_MEMBER('dbo') = 1) RETURN; 
    INSERT INTO Tracking.dbo.Activity (moment, name) VALUES (GETDATE(), ORIGINAL_LOGIN()); 
END TRY 
BEGIN CATCH 
    --Do nothing 
END CATCH 
GO 
+0

seul problème avec ceci est que si elle atteint le bloc catch d'une erreur d'avortement par lots, vous êtes foutu. Par conséquent, vous ne pourrez pas valider ou effectuer d'autres mises à jour dans la transaction. –

+0

@zedo: c'est un déclencheur de connexion Quelle transaction? – gbn

+0

Cela ne m'a pas aidé. L'exception n'est pas supprimée dans le bloc catch comme cela devrait être le cas dans les langages de programmation normaux. – meir

0

@ réponse de GBN n » était pas T assez assez; même si l'exception est interceptée, les connexions échouent toujours. Curieusement, j'ai trouvé une autre réponse par @gbn qui rend la solution claire: https://dba.stackexchange.com/a/8696/114706. Donc, voici ma façon de s'assurer que les exceptions dans le déclencheur de connexion ne provoquent pas l'échec de toutes les connexions. C'est peut-être exagéré, mais comme les exceptions ici peuvent être vraiment pénibles à gérer, je préfère aller trop loin que pas assez loin.

CREATE TRIGGER trigLogon_Audit 
ON ALL SERVER 
FOR LOGON 
AS 
BEGIN 
    BEGIN TRY 
     --make sure that XACT_ABORT is off, or exceptions (even if caught), will cause all logins to fail. 
     DECLARE @XACT_ABORT_WasOn BIT = 0 
     IF (@@OPTIONS & 16384) = 16384 
     BEGIN 
      SET @XACT_ABORT_WasOn = 1 
      SET XACT_ABORT OFF; --this prevents any failure from killing the login. 
     END 

     --Put whatever logic you were trying to execute here; if there's a RETURN statement, make sure that XACT_ABORT gets set back to its original state. 
    END TRY 
    BEGIN CATCH 
     --Do nothing 
    END CATCH 

    --set XACT_ABORT back to its original state. 
    IF (@XACT_ABORT_WasOn = 1) 
    BEGIN 
     SET XACT_ABORT ON; 
    END 
END 
+0

Existe-t-il un moyen d'intercepter l'erreur d'ouverture de session qui a échoué dans le déclencheur d'ouverture de session? –

+0

Eh bien, vous pourriez probablement faire quelque chose dans le bloc catch avec @@ error ou error_message(), mais vous devrez faire très attention. Mettre ces valeurs dans une table, par exemple, pourrait échouer à bien des égards, et vous auriez alors des erreurs qui signaleraient des erreurs. À mon avis, même avoir un déclencheur d'ouverture de session est un risque assez important, mais si vous ne pouvez pas l'éviter, vous devriez rendre tout traitement qui survient plus tard résilient aux échecs. Pour ce que je fais, mon déclencheur de connexion copie les données dans une table optimisée pour la mémoire, mais les procs qui s'appuient sur les données savent comment les gérer quand les données sont manquantes. – rrreee