Как я подавляю любое условие ошибки в триггере входа в систему сервера SQL - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть триггер входа в систему на сервере sql для аудита входов в систему.

Я хочу отменить любые ошибки, возвращаемые из него, поскольку ошибка предотвращает вход в систему.

Как мне это сделать?

Вот мой триггерный код

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

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Вы можете проглотить ошибку, молча используя 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
1 голос
/ 10 января 2017

@ gbn ответа было недостаточно;даже если исключение будет обнаружено, вход в систему все равно будет неудачным.Как ни странно, я нашел другой ответ от @gbn, который проясняет решение: https://dba.stackexchange.com/a/8696/114706. Так вот мой способ убедиться, что исключения в триггере входа в систему не вызывают сбой всех входов в систему.Это может быть излишним, но так как исключения здесь могут быть действительно болезненными, я бы предпочел зайти слишком далеко, чем недостаточно.

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
1 голос
/ 14 декабря 2010

Вы можете иметь код обработки ошибок в триггере, но вы не можете многое сделать, потому что когда в триггере происходит ошибка, пакет прерывается (если вы не ошибка самостоятельно с помощью RAISERROR).

Две хорошие статьи по обработке ошибок Эрландом Соммарскогом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...