Кто-нибудь видит проблемы с производительностью моего входа триггера? - PullRequest
1 голос
/ 03 августа 2009

Кто-нибудь видит проблемы с производительностью при моем входе в систему Trigger?

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

В настоящее время у меня работает триггер входа в систему на моем сервере разработки SQL. Я позволил ему работать в прошлые выходные, и он поместил более 50 000 строк в мою таблицу журнала аудита. Я заметил, что 95% записей, где для входа в систему «NT AUTHORITY / SYSTEM». Поэтому я решил что-нибудь отфильтровать с помощью NT AUTHORITY% и просто не вставлять эти записи. Я думаю, что если я отфильтрую эти записи 'NT AUTHORITY', то количество ресурсов, которые я сэкономлю на этих вставках, компенсирует стоимость проверки оператора IF. Я также наблюдал за Prefmon и не вижу ничего необычного, когда триггер включен, но с другой стороны, мой сервер разработки не видит такой же объем активности, как у производства.

USE [MASTER]
GO

CREATE TRIGGER AuditServerAuthentication
ON ALL SERVER
WITH EXECUTE AS SELF
FOR LOGON
AS BEGIN

DECLARE @event XML, @Logon_Name VARCHAR(100)
SET @Event = EVENTDATA()
SET @Logon_Name =  CAST(@event.query('/EVENT_INSTANCE/LoginName/text()') AS VARCHAR(100))

IF @Logon_Name NOT LIKE 'NT AUTHORITY%'
BEGIN
    INSERT INTO Auditing.Audit.Authentication_Log 
        (Post_Time,Event_Type,Login_Name,Client_Host,Application_Name,Event_Data)
    VALUES
        (
            CAST(CAST(@event.query('/EVENT_INSTANCE/PostTime/text()') AS VARCHAR(64)) AS DATETIME),
            CAST(@event.query('/EVENT_INSTANCE/EventType/text()') AS VARCHAR(100)),
            CAST(@event.query('/EVENT_INSTANCE/LoginName/text()') AS VARCHAR(100)),
            CAST(@event.query('/EVENT_INSTANCE/ClientHost/text()') AS VARCHAR(100)),
            APP_NAME(),
            @Event
        )
END
END
GO

Ответы [ 3 ]

1 голос
/ 04 августа 2009

Я использую очень похожие триггеры на своих серверах и не испытываю проблем с производительностью. Производственная БД получает около 10 логинов в секунду. Это создает огромное количество данных с течением времени, что приводит к увеличению объема резервных копий и т. Д.

Для некоторых серверов я создал таблицу с пользователями, которые не должны регистрироваться при входе в систему, что также позволяет отказаться от входа в систему в соответствии с рабочим временем

Разница с моим триггером в том, что я создал базу данных для целей аудита, в которой я создал несколько хранимых процедур, которые я вызываю в триггере. Спусковой крючок выглядит так

alter TRIGGER [tr_AU_LogonLog] ON ALL SERVER
WITH EXECUTE AS 'AUDITUSER'
FOR LOGON
AS
BEGIN
    DECLARE
        @data XML
      , @rc INT
    SET @data = EVENTDATA()
    EXEC @rc = AuditDB.dbo.LogonLog @data
END ;

Производственная БД получает около 10 входов в секунду. Это создает огромное количество данных с течением времени, что приводит к увеличению объема резервных копий и т. Д.

РЕДАКТИРОВАТЬ: о, я забыл, его рекомендуется, если вы создаете определенного пользователя для триггера, в некоторых случаях выполнение от имени самого себя может быть опасным.

EDIT2: здесь есть некоторая полезная информация об операторе execute as здесь . и будьте осторожны при реализации триггеров, вы можете случайно заблокировать себя, я рекомендую держать соединение открытым на всякий случай:)

0 голосов
/ 04 августа 2009

Нет ничего очевидного. Это эффективно, если IF защищает вставку. Единственное, что я хотел бы проверить, это то, насколько дорогой анализ XML - я еще не использовал его в SQL Server, поэтому он мне неизвестен.

По общему признанию, для Microsoft было бы странно предоставить простой способ получения метаданных (EVENTDATA()), но сделать его анализ дорогостоящим, но произошли более странные вещи ...

0 голосов
/ 03 августа 2009

Для меня это совсем не выглядит дорогостоящим заявлением IF (это не значит, что вы выбираете что-то из базы данных) и, как вы говорите, будет намного дешевле, чем выполнение INSERT, которое не нужно 95% времени Тем не менее, я должен добавить, что я всего лишь программист базы данных, а не администратор баз данных, поэтому я готов к исправлению здесь.

Мне, правда, немного любопытно, что же , почему вы это делаете? Разве SQL Server уже не имеет встроенного механизма аудита входа в систему , который вы можете использовать?

...