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

[sql] view plain copy

  1. --合同修改 Begin
  2. --触发器是插入还是更新 Begin
  3. --通过对 Inserted逻辑表  Deleted逻辑表 的判断
  4. --来确认是插入 还是更新
  5. DECLARE @DFlag BIT = 0
  6. DECLARE @IFlag BIT = 0
  7. IF EXISTS(SELECT * FROM DELETED)
  8. SET @DFlag = 1
  9. IF EXISTS(SELECT * FROM INSERTED)
  10. SET @IFlag = 1
  11. --触发器是插入还是更新 End
  12. --修改合同的时候
  13. IF @IFlag = 1 AND @DFlag = 1
  14. IF update(new_dept_contract_r1) and exists(
  15. select * from INSERTED i left join DELETED d
  16. on i.New_contractId = d.New_contractId where i.new_dept_contract_r1 <> d.new_dept_contract_r1
  17. )
  18. begin
  19. --替换部门Code
  20. declare @oldcode nvarchar(10),@newcode nvarchar(10),@contractid uniqueidentifier
  21. select
  22. @oldcode = ‘-‘+old.New_dept_code+‘-‘
  23. ,@newcode = ‘-‘+new.New_dept_code+‘-‘
  24. ,@contractid =  i.New_contractId
  25. from INSERTED i
  26. left join DELETED d on i.New_contractId = d.New_contractId
  27. left join  dbo.A new on i.new_dept_contract_r1 = new.New_deptId
  28. left join  dbo.A old on d.new_dept_contract_r1 = old.New_deptId
  29. update B
  30. set new_contract_name =  replace(new_contract_name,@oldcode,@newcode)
  31. where New_contractId= @contractid
  32. end
  33. --合同修改 End
时间: 2024-08-05 07:57:24

SQL触发器中的inserted表和deleted表的相关文章

SQL触发器中的deleted表和inserted表

SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表用于存储 DELETE和 UPDATE语句所影响的行的复本.在执行DELETE或 UPDATE语句时,行从触发器表中删除,并传输到 deleted表中.Deleted表和触发器表通常没有相同的行. Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本.在一个插入或更新事

触发器中的inserted表和deleted表

触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft? SQL Server 2000 自动创建和管理这些表.可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件:然而,不能直接对表中的数据进行更改. inserted和deleted表主要用于触发器中: ·扩展表间引用完整性 ·在以视图为基础的基表中插入或更新数据 ·检查错误并基于错误采取行动 找到数据修改前后表状态的差异,并基于此差异采取行动. Deleted表用于存储DELE

SQL触发器中若取到null值可能引发的问题

declare @code varchar(20), @cs varchar(20),@zc varchar(20)set @cs='('[email protected]+'*'[email protected]+')'print '字符'[email protected]insert into TESTER2 values(@cs,@zc,@cs) declare @code varchar(20), @cs varchar(20),@zc varchar(20)set @cs='1'set

SQL Server 中的触发器(trigger)

SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 20

SQL语句中的表操作

数据库中主要的部分是不同的表,在SQL语句中提供了一些对于表的操作.我们讨论的操作都是在SQL SERVICE中的 一.新建表: 新建表的语法格式为:CREATE TABLE 表名(列名 数据类型[完整性约束条件], 列名 数据类型 [完整性约束条件],...);其中完整性约束条件可以添加也可以不加,如果不加也可以在表定义完成后另外在添加,比如我们现在需要创建一个学生表,可以使用这样的代码来创建: create table student(Sno char(10) PRIMARY KEY, Sn

SQL触发器实例(下)

1 基本语法: 2 Create Trigger [TriggerName] 3 ON [TableName] 4 FOR [Insert][,Delete][,Update] 5 AS 6 --触发器要执行的操作语句. 7 Go 8 9 注意: 10 触发器中不允许以下 Transact-SQL 语句: 11 Alter DATABASE ,Create DATABASE,DISK INIT, 12 DISK RESIZE, Drop DATABASE, LOAD DATABASE, 13 L

SQL触发器实例讲解

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )

sql触发器知识

触发器中的Inserted和deleted临时表: SQL2000中,inserted表和deleted表用于存放对表中数据行的修改信息.他们是触发器执行时自动创建的,放在内存中,是临时表.当触发器工作完成,它们也被删除.它们是只读表,不能向它们写入内容. inserted表:用来存储INSERT和UPDATE语句所影响的行的副本.意思就是在inserted表中临时保存了被插入或被更新后的记录行.在执行 INSERT 或UPDATE 语句时,新加行被同时添加到inserted表和触发器表中.因此

C# Sql 触发器

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 2005中触发器可以分为两类:DM