SQL Server触发器如何判断是插入、删除还是更新操作

拾光
拾光
发布时间:2026-10-15 | 6人浏览过
原创

在数据库管理中,有时可以将针对同一张表的插入、删除和更新操作合并到一个触发器中进行统一处理。通过检测系统提供的两个虚拟表(INSERTED 和 DELETED),可以准确判断触发器响应的是哪种数据变更事件。

利用虚拟表进行判断

SQL Server 触发器在处理数据时,有两个特殊的内部临时表可供参考:INSERTED 表用于保存新增或修改后的新数据;DELETED 表用于保存被删除的旧数据或更新前的旧数据。我们可以通过编写简单的代码,根据这两个表是否有记录来确定当前的操作类型。

-- 宣告两个变量来标记状态
DECLARE @D BIT = 0 -- 标记 Deleted 表是否有数据
DECLARE @I BIT = 0 -- 标记 Inserted 表是否有数据

-- 如果在 DELETED 表中找到记录,说明有旧数据被删除或更新,即发生了非纯插入的操作
IF EXISTS(SELECT TOP 1 1 FROM DELETED)
SET @D = 1

-- 如果在 INSERTED 表中找到记录,说明有新数据插入或被更新,即发生了非纯删除的操作
IF EXISTS(SELECT TOP 1 1 FROM INSERTED)
SET @I = 1

-- 如果两个表都有记录,说明是执行了更新操作 (UPDATE),既有旧数据又有新数据
IF @I = 1 AND @D = 1
PRINT(N'更新。')

-- 如果只有 INSERTED 表有数据,而 DELETED 表没有,说明是执行了插入操作 (INSERT)
IF @I = 1 AND @D = 0
PRINT(N'插入')

-- 如果只有 DELETED 表有数据,而 INSERTED 表没有,说明是执行了删除操作 (DELETE)
IF @I = 0 AND @D = 1
PRINT(N'删除')

理解 INSERTED 与 DELETED 表的数据状态

为了正确使用上述判断逻辑,需要清楚了解在不同操作场景下这两个虚拟表的具体表现:

  1. 插入操作 (INSERT):行被添加后,INSERTED 表中包含该行的新数据,而 DELETED 表为空。
  2. 更新操作 (UPDATE):行被修改前,旧数据存入 DELETED 表;修改后,新数据存入 INSERTED 表。此时两表均有数据。
  3. 删除操作 (DELETE):行被删除前,其旧数据被移入 DELETED 表,而 INSERTED 表为空。

以上就是如何通过 T-SQL 代码判断 SQL Server 触发器正在处理的是插入、删除还是更新操作的详细内容,更多关于数据库触发器开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表