2010-12-14 2 views
2

Ich habe einen SQL-Server Login-Trigger, um Logins zu überprüfen.Wie kann ich Fehler in einem SQL-Server Login-Trigger unterdrücken

Ich möchte alle Fehler zurück, die von ihm zurückgegeben werden, da ein Fehler Login verhindert.

Wie mache ich das?

Hier ist meine Trigger-Code

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 

Antwort

1

Sie können Fehler haben Code in einem Trigger Handling aber man kann nicht viel tun, weil , wenn ein Fehler in einem Trigger ist nun mal die Partie abgebrochen wird (es sei denn, Sie der Fehler erhöhen sich mit RAISERROR).

Zwei gute Artikel über die Fehlerbehandlung von Erland Sommarskog:

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

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

+0

In diesen Artikeln geht es um SQL Server 2000. Gibt es eine Lösung für SQL Server 2008? Ich kann nicht glauben, dass so eine einfache Sache in modernen Programmiersprachen unmöglich ist. – meir

1

Sie den Fehler schlucken kann geräuschlos 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

nur Problem damit ist, dass, wenn es den catch-Block von einem Batch-Abbruch-Fehler erreicht, Sie sind geschraubt. Daher können Sie innerhalb der Transaktion keine weiteren Aktualisierungen vornehmen oder durchführen. –

+0

@ zedo: Es ist ein Anmelde-Trigger Welche Transaktion? – gbn

+0

Das hat mir nicht geholfen. Ausnahme wird im catch-Block nicht unterdrückt, wie es in normalen Programmiersprachen der Fall sein sollte. – meir

0

@ gbn Antwort mit wasn‘ t ziemlich genug; Selbst wenn die Ausnahme abgefangen wird, werden Anmeldungen weiterhin fehlschlagen. Seltsamerweise fand ich eine andere Antwort von @ gbn, die die Lösung klar macht: https://dba.stackexchange.com/a/8696/114706. Hier ist meine Möglichkeit sicherzustellen, dass Ausnahmen im Anmelde-Trigger nicht dazu führen, dass alle Anmeldungen fehlschlagen. Es mag übertrieben sein, aber da Ausnahmen hier sehr schmerzhaft sein können, gehe ich lieber zu weit als zu weit.

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

Gibt es eine Möglichkeit, den fehlgeschlagenen Anmeldefehler im Anmelde-Trigger abzufangen? –

+0

Nun, vermutlich könnten Sie etwas im catch-Block mit @@ error oder error_message() tun, aber Sie müssen sehr vorsichtig sein. Wenn Sie diese Werte beispielsweise in eine Tabelle eingeben, kann dies viele Fehler verursachen und Sie haben dann Fehler, die Fehler melden. Meiner Meinung nach ist ein Anmelde-Trigger zwar ein ziemlich großes Risiko, aber wenn Sie es nicht vermeiden können, sollten Sie jede später auftretende Verarbeitung für Fehler anfällig machen. Für das, was ich mache, kopiert mein Logon-Trigger Daten in eine speicheroptimierte Tabelle, aber die Prozeduren, die auf die Daten angewiesen sind, wissen, wie sie mit Daten umgehen müssen, wenn die Daten fehlen. – rrreee

Verwandte Themen