You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位SQL Server遗留库中删除dbo.TableA数据的对象?

定位SQL Server批量删除操作来源的实用方法

1. 用扩展事件跟踪删除操作(生产环境首选)

扩展事件比SQL Server Profiler资源占用更低,适合长期监控:

  • 创建事件会话,跟踪sqlserver.sql_statement_completed事件,添加过滤条件:object_name = N'TableA' AND statement LIKE N'%DELETE%'
  • 捕获字段包含:会话ID、登录名、应用程序名称、执行的SQL文本、主机名

2. 扫描数据库对象中的删除逻辑

直接查询所有可能包含TableA删除语句的存储过程、视图、函数:

SELECT 
    o.name AS 对象名,
    o.type_desc AS 对象类型,
    m.definition AS 定义文本
FROM sys.sql_modules m
JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition LIKE N'%DELETE%' 
  AND m.definition LIKE N'%TableA%'
  AND o.type IN ('P', 'V', 'FN', 'IF', 'TF')

3. 排查SQL Server Agent作业

遍历所有作业步骤,检查是否有针对TableA的删除脚本:

SELECT 
    j.name AS 作业名,
    js.step_name AS 步骤名,
    js.command AS 执行命令
FROM msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobsteps js ON j.job_id = js.job_id
WHERE js.command LIKE N'%DELETE%' 
  AND js.command LIKE N'%TableA%'

4. 检查表关联的触发器

确认是否有触发器自动触发TableA的删除操作:

SELECT 
    t.name AS 触发器名,
    m.definition AS 触发器定义
FROM sys.triggers t
JOIN sys.sql_modules m ON t.object_id = m.object_id
JOIN sys.objects o ON t.parent_id = o.object_id
WHERE o.name = N'TableA'

5. 启用表级审计

为TableA创建审计规则,记录所有删除操作的上下文信息:

-- 创建服务器审计
CREATE SERVER AUDIT [TableA_Delete_Audit]
TO FILE (FILEPATH = N'D:\SQL_Audit_Logs\') -- 替换为实际存储路径
WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE);
GO

-- 创建数据库审计规范
CREATE DATABASE AUDIT SPECIFICATION [TableA_Delete_Spec]
FOR SERVER AUDIT [TableA_Delete_Audit]
ADD (DELETE ON OBJECT::dbo.TableA BY PUBLIC)
WITH (STATE = ON);
GO

-- 启动审计
ALTER SERVER AUDIT [TableA_Delete_Audit] WITH (STATE = ON);
GO

读取审计日志:

SELECT *
FROM sys.fn_get_audit_file(N'D:\SQL_Audit_Logs\TableA_Delete_Audit_*.sqlaudit', DEFAULT, DEFAULT);

6. 检查复制同步逻辑

若数据库配置了复制,排查发布、订阅的同步脚本:

-- 查看所有发布信息
SELECT name AS 发布名, description AS 描述
FROM distribution.dbo.MSpublications

-- 查看复制相关作业
SELECT 
    sj.name AS 作业名,
    sjs.command AS 执行命令
FROM msdb.dbo.sysjobs sj
JOIN msdb.dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
WHERE sj.name LIKE N'%repl%'

7. 查询执行计划缓存

检查近期执行过的、涉及TableA删除的计划,定位触发对象:

SELECT 
    cp.objtype AS 对象类型,
    OBJECT_NAME(st.objectid) AS 对象名,
    st.text AS 执行语句
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE st.text LIKE N'%DELETE%' 
  AND st.text LIKE N'%TableA%'

内容的提问来源于stack exchange,提问作者Bohdan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:48:15