如何在SQL触发器中判断数据行是被更新还是删除?
问题描述
我编写了如下创建SQL触发器的代码:
CREATE TRIGGER TRIGGERNAME ON [TABLENAME] AFTER INSERT, UPDATE, DELETE AS BEGIN --[SQL STATEMENTS] END
现需在该触发器的SQL语句中实现如下逻辑:
if (a row is updated) { -- do something } else if (a row is deleted) { -- do something else }
请问该如何实现此判断逻辑?
解决方案
在SQL Server的触发器中,可借助INSERTED和DELETED两个虚拟表判断操作类型:
INSERTED表:仅在INSERT或UPDATE操作时存在,存储插入/更新后的行数据DELETED表:仅在DELETE或UPDATE操作时存在,存储删除/更新前的行数据
基于这两个表的存在性,就能实现目标判断逻辑,修改后的触发器代码如下:
CREATE TRIGGER TRIGGERNAME ON [TABLENAME] AFTER INSERT, UPDATE, DELETE AS BEGIN -- 判断UPDATE操作:UPDATE时两个虚拟表均有数据 IF EXISTS(SELECT 1 FROM INSERTED) AND EXISTS(SELECT 1 FROM DELETED) BEGIN -- 此处编写UPDATE对应的处理逻辑 PRINT '执行UPDATE操作的处理逻辑'; END -- 判断DELETE操作:DELETE时仅DELETED表有数据 ELSE IF EXISTS(SELECT 1 FROM DELETED) BEGIN -- 此处编写DELETE对应的处理逻辑 PRINT '执行DELETE操作的处理逻辑'; END END
补充说明:
- 若需处理INSERT操作,可新增
ELSE IF EXISTS(SELECT 1 FROM INSERTED)分支 - 使用
EXISTS(SELECT 1 FROM ...)是高效的判断方式,无需返回实际数据,仅需确认表中是否存在行即可
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

