是否有人发现我的登录触发器存在性能问题?
在将此触发器推送到生产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
答案 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()
)但解析起来却很昂贵,但却发生了一些奇怪的事情......