首页 > 代码库 > SQL触发器中的inserted表和deleted表
SQL触发器中的inserted表和deleted表
简介:开发也有年头了,但是触发器确实用的比较少,但是无容置疑触发器确实不错,
最近项目要求需要用到的触发器特别多、频繁,觉得很有必要记录和积累下。
在触发器语句中用两个特殊的表一个是deleted表和inserted。
它们是通过触发器操作自动创建驻留在内存中的临时表。
--------------------------------------------------------------------------------------------------------------------------------------------
描述:
Deleted表用于存储 DELETE和 UPDATE语句所影响的行的复本。在执行DELETE或 UPDATE语句时,行从触发器表中删除,并传输到 deleted表中。Deleted表和触发器表通常没有相同的行。
Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
综上可以总结一下:
触发器的操作
deleted表和inserted表的数据变化
插入操作(Insert)
Inserted表有数据,Deleted表无数据
删除操作(Delete)
Inserted表无数据,Deleted表有数据
更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)
--------------------------------------------------------------------------------------------------------------------------------------------
实践:
下面将以触发器中的修改业务为例讲述Inserted和Deleted的结合操作;
在合同中根据编号部门改变而修改合同号;
在合同管理系统中生成的合同编号,
如对应部门修改,合同编号中对应部门代码对应修改,流水号不变;
修改前:15-TV-56-0996
修改后:15-TV-GB-0996
- --合同修改 Begin
- --触发器是插入还是更新 Begin
- --通过对 Inserted逻辑表 Deleted逻辑表 的判断
- --来确认是插入 还是更新
- DECLARE @DFlag BIT = 0
- DECLARE @IFlag BIT = 0
- IF EXISTS(SELECT * FROM DELETED)
- SET @DFlag = 1
- IF EXISTS(SELECT * FROM INSERTED)
- SET @IFlag = 1
- --触发器是插入还是更新 End
- --修改合同的时候
- IF @IFlag = 1 AND @DFlag = 1
- IF update(new_dept_contract_r1) and exists(
- select * from INSERTED i left join DELETED d
- on i.New_contractId = d.New_contractId where i.new_dept_contract_r1 <> d.new_dept_contract_r1
- )
- begin
- --替换部门Code
- declare @oldcode nvarchar(10),@newcode nvarchar(10),@contractid uniqueidentifier
- select
- @oldcode = ‘-‘+old.New_dept_code+‘-‘
- ,@newcode = ‘-‘+new.New_dept_code+‘-‘
- ,@contractid = i.New_contractId
- from INSERTED i
- left join DELETED d on i.New_contractId = d.New_contractId
- left join dbo.A new on i.new_dept_contract_r1 = new.New_deptId
- left join dbo.A old on d.new_dept_contract_r1 = old.New_deptId
- update B
- set new_contract_name = replace(new_contract_name,@oldcode,@newcode)
- where New_contractId= @contractid
- end
- --合同修改 End
SQL触发器中的inserted表和deleted表