我在 SQL Server 2016 实例上激活了审核。
版本 i SP1 CU3,企业版。
使用此查询:
SELECT * FROM sys.server_file_audits
我得到log_file_path: O:\auditfiles\
在log_file_name 中: logins_3D6DA4C0-B388-4175-88A5-D2820733CFB7.sqlaudit
但是当我查询时:
SELECT * FROM sys.fn_get_audit_file ('O:\auditfiles\logins_3D6DA4C0-B388-4175-88A5-D2820733CFB7.sqlaudit',default,default);
它什么也不返回。
在文件系统上检查文件的真实名称是:
logins_3D6DA4C0-B388-4175-88A5-D2820733CFB7_0_131451051332700000.sqlaudit
其中文件名部分_0_131451051332700000未从对 sys 模式的查询中检索到。
当我选择正确的文件名时,我得到了结果。
我需要自动执行此操作,以便从外部查询中收集数据。
如何检索正确的文件名?
查看 sys.server_file_audits 的文档,是
log_file_name
(突出显示我的)根据创建 sqlaudit 文件的速度,确定“当前”审计文件是什么可能非常困难。
如果您想要快速一次性选择审计信息,您可以使用通配符“*.sqlaudit”来读取目录中的所有文件。
读取当前正在写入的 sqlaudit 文件会带来挑战,因为可以在您刚刚读取该活动文件后立即将行写入该文件,因此如果您不连续选择它们,您可能会错过未来的审计行。此外,请注意,审计文件将继续写入您的目录路径,并且通配符选择将运行的时间越来越长,除非您对 sqlaudit 文件实施某种修剪过程。
如果您打算跟踪和保存此审核信息,我建议实施类似于我为“如何将数据从 SQL Server 审核文件加载到表中? ”的答案的解决方案。'
它使用执行存储过程的 Sql Agent 作业来处理 sqlaudit 文件。总之,存储过程: