有没有人看到我的登录触发器的性能问题?

时间:2009-08-03 18:45:19

标签: sql-server sql-server-2005 triggers

是否有人发现我的登录触发器存在性能问题?

在将此触发器推送到生产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 个答案:

答案 0 :(得分:1)

我在服务器中使用了非常类似的触发器,我没有遇到任何性能问题。生产数据库每秒大约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次登录。这会随着时间的推移产生大量数据,从而转化为更大的备份等。

编辑:哦,我忘了,如果你为触发器创建一个特定用户,建议在某些情况下以self身份执行可能会很危险。

EDIT2:有一些关于执行语句here的有用信息。哦,在实施触发器时要小心,你可能会意外锁定自己,我建议保持连接打开以防万一:)

答案 1 :(得分:0)

对我来说,它看起来不像是一个昂贵的IF语句(它不像你从数据库中选择任何东西),正如你所说的那样,执行INSERT的成本要低得多95%的时间。但是,我应该补充一点,我只是一个数据库程序员而不是DBA,所以我愿意在这里得到纠正。

但是,我对为什么这样做有点好奇? SQL Server是否已经拥有可以使用的a built-in mechanism for Login Auditing

答案 2 :(得分:0)

没有什么是明显的。它实际上是一个保护INSERT的IF。我唯一要验证的是XML解析的成本是多少 - 我还没有在SQL Server中使用它,所以我不知道。

不可否认,微软似乎很难提供一种简单的方法来获取元数据(EVENTDATA())但解析起来却很昂贵,但却发生了一些奇怪的事情......

相关问题