Azure SQL审计文件sys.fn_get_audit_file无法获取受影响行数的问题排查
解决Azure SQL Server/MI审计日志中response_rows始终为0的问题
常见原因及修复步骤
1. 审计策略缺少关键操作组
默认审计策略可能没包含能捕获行计数的操作组,必须启用以下组才能让response_rows正确统计:
DATABASE_OBJECT_ACCESS_GROUP:捕获表、视图等对象的SELECT/INSERT/UPDATE/DELETE操作的行计数- 细粒度语句组(可选):
SELECT_STATEMENT_GROUP、INSERT_STATEMENT_GROUP、UPDATE_STATEMENT_GROUP、DELETE_STATEMENT_GROUP,针对特定语句类型精准捕获 - 如果涉及存储过程内部操作,还要加
EXECUTE_STATEMENT_GROUP,否则只会捕获存储过程调用,不会统计内部操作的行数
去Azure门户里调整审计策略,把这些操作组加进去,不要只保留默认的少数组。
2. 操作类型的统计限制
SELECT语句的response_rows只有当查询返回实际结果集时才会有值,比如SELECT * FROM Table会统计行数,但SELECT COUNT(*) FROM Table或者存储过程里不返回结果的SELECT不会统计- 批量操作(比如
INSERT INTO ... SELECT ...)需要确保审计能捕获到具体的执行语句,而不是只记录外层语句,这时候依赖DATABASE_OBJECT_ACCESS_GROUP的配置
3. 存储目标的兼容性问题
如果审计日志存在Azure Blob存储,偶尔会出现字段捕获不全的情况,可以临时切换到Azure Log Analytics测试,看response_rows是否正常。如果Log Analytics里正常,说明Blob存储的配置或权限有问题,检查存储账户的访问策略是否允许审计服务写入和读取日志。
4. 实例版本bug
旧版本的Azure SQL MI或逻辑服务器可能存在response_rows统计的bug,执行SELECT @@VERSION确认实例版本,确保是SQL Server 2019兼容级别或更高,必要时提交升级请求。
验证测试
执行以下测试语句,然后查询审计日志:
-- 创建测试表(如果没有) CREATE TABLE TestAuditRows (ID INT, Value VARCHAR(50)); -- 执行测试操作 INSERT INTO TestAuditRows VALUES (1, 'A'), (2, 'B'); SELECT * FROM TestAuditRows; UPDATE TestAuditRows SET Value = 'Updated' WHERE ID = 1; DELETE FROM TestAuditRows WHERE ID = 2; -- 查询审计日志 SELECT event_time, action_id, statement, response_rows FROM sys.fn_get_audit_file('https://your-storage-account.blob.core.windows.net/your-audit-container/...', DEFAULT, DEFAULT) WHERE statement LIKE '%TestAuditRows%' ORDER BY event_time DESC;
如果测试操作的response_rows还是0,优先检查审计策略的操作组是否配置正确。
内容的提问来源于stack exchange,提问作者richa agarwal
相关产品推荐
相关产品推荐

