如何在Azure Synapse专用SQL池中查看表的删除与截断操作日志
在Azure Synapse专用SQL池中查询DELETE/TRUNCATE操作日志
方法1:通过动态管理视图(DMVs)查询近期操作
专用SQL池的内置DMVs可查询短周期内的执行请求记录,适合查看近期操作:
SELECT s.session_id, s.login_name, s.login_time, r.command, r.start_time, r.end_time, r.status, OBJECT_NAME(t.object_id, t.database_id) AS target_table, t.database_id FROM sys.dm_pdw_exec_requests r JOIN sys.dm_pdw_exec_sessions s ON r.session_id = s.session_id LEFT JOIN sys.dm_pdw_sql_requests sr ON r.request_id = sr.request_id LEFT JOIN sys.objects t ON sr.object_id = t.object_id WHERE r.command LIKE '%DELETE%' OR r.command LIKE '%TRUNCATE TABLE%' ORDER BY r.start_time DESC;
- 查询结果包含执行操作的登录名、操作时间、命令内容、目标表(若能关联到)等信息。
- DMVs中的数据仅保留较短周期(通常数天,取决于系统负载),无法查询更早期的历史记录。
方法2:查询存储的审计日志(历史记录)
若需查询更早的操作记录,需确保已为专用SQL池启用审计功能,日志会存储至Azure Blob存储或Azure Log Analytics。
从Azure Blob存储读取审计日志
SELECT event_time, session_server_principal_name AS executor, database_name, object_name AS target_table, statement AS executed_command, succeeded AS operation_result FROM sys.fn_get_audit_file('https://<你的存储账户名>.blob.core.windows.net/<容器名>/<审计日志路径>', DEFAULT, DEFAULT) WHERE action_id IN ('DL', 'TC') -- DL对应DELETE操作,TC对应TRUNCATE操作 ORDER BY event_time DESC;
- 替换
<你的存储账户名>、<容器名>、<审计日志路径>为实际配置信息。 - 需确保SQL池具备访问该Blob存储的权限(如SAS令牌或托管身份)。
在Azure Log Analytics中查询审计日志
若审计日志发送至Log Analytics,可使用以下Kusto查询:
AzureDiagnostics | where ResourceProvider == "MICROSOFT.SYNAPSE" | where Category == "SqlPoolAuditLogs" | where action_id in ("DL", "TC") | project 操作时间=event_time_t, 执行者=session_server_principal_name_s, 数据库名=database_name_s, 目标表=object_name_s, 执行命令=statement_s, 操作结果=succeeded_s | order by 操作时间 desc
注意事项
- 仅拥有
VIEW SERVER STATE权限的用户可执行上述查询。 - 部分TRUNCATE操作可能无法直接关联到目标表,需通过
executed_command字段确认具体操作对象。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

