触发器中两个特殊表的应用

inserted   --   更新后的表       insert和update触发器中有   
deleted     --   更新前的表       delete和update触发器中有 

使用   inserted   和   deleted   表  
  触发器语句中使用了两种特殊的表:deleted   表和   inserted   表。Microsoft®   SQL   Server™   2000   自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。  
   
  inserted   和   deleted   表主要用于触发器中:    
   
  扩展表间引用完整性。  
   
   
  在以视图为基础的基表中插入或更新数据。  
   
   
  检查错误并基于错误采取行动。  
   
   
  找到数据修改前后表状态的差异,并基于此差异采取行动。    
  Deleted   表用于存储   DELETE   和   UPDATE   语句所影响的行的复本。在执行   DELETE   或   UPDATE   语句时,行从触发器表中删除,并传输到   deleted   表中。Deleted   表和触发器表通常没有相同的行。  
   
  Inserted   表用于存储   INSERT   和   UPDATE   语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到   inserted   表和触发器表中。Inserted   表中的行是触发器表中新行的副本。  
   
  更新事务类似于在删除之后执行插入;首先旧行被复制到   deleted   表中,然后新行被复制到触发器表和   inserted   表中。  
   
  在设置触发器条件时,应当为引发触发器的操作恰当使用   inserted   和   deleted   表。虽然在测试   INSERT   时引用   deleted   表或在测试   DELETE   时引用   inserted   表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。  
   
   
   
  说明     如果触发器操作取决于一个数据修改所影响的行数,应该为多行数据修改(基于   SELECT   语句的   INSERT、DELETE   或   UPDATE)使用测试(如检查   @@ROWCOUNT),然后采取相应的对策。  
   
   
  SQL   Server™   2000   不允许   AFTER   触发器引用   inserted   和   deleted   表中的   text、ntext   或   image   列;然而,允许   INSTEAD   OF   触发器引用这些列。有关更多信息,请参见   CREATE   TRIGGER。  
   
  在   INSTEAD   OF   触发器中使用   inserted   和   deleted   表  
  传递到在表上定义的   INSTEAD   OF   触发器的   inserted   和   deleted   表遵从与传递到   AFTER   触发器的   inserted   和   deleted   表相同的规则。inserted   和   deleted   表的格式与在其上定义   INSTEAD   OF   触发器的表的格式相同。inserted   和   deleted   表中的每一列都直接映射到基表中的列。    
   
  有关引用带   INSTEAD   OF   触发器的表的   INSERT   或   UPDATE   语句何时必须提供列值的规则与表没有   INSTEAD   OF   触发器时相同:    
  不能为计算列或具有   timestamp   数据类型的列指定值。    
  不能为具有   IDENTITY   属性的列指定值,除非该列的   IDENTITY_INSERT   为   ON。当   IDENTITY_INSERT   为   ON   时,INSERT   语句必须提供一个值。    
  INSERT   语句必须为所有无   DEFAULT   约束的   NOT   NULL   列提供值。  
   
   
  对于除计算列、标识列或   timestamp   列以外的任何列,任何允许空值的列或具有   DEFAULT   定义的   NOT   NULL   列的值都是可选的。    
  当   INSERT、UPDATE   或   DELETE   语句引用具有   INSTEAD   OF   触发器的视图时,数据库引擎将调用该触发器,而不是对任何表采取任何直接操作。即使为视图生成的   inserted   和   deleted   表中的信息格式与基表中的数据格式不同,该触发器在生成执行基表中的请求操作所需的任何语句时,仍必须使用   inserted   和   deleted   表中的信息。  
   
  传递到在视图上定义的   INSTEAD   OF   触发器的   inserted   和   deleted   表格式与为该视图定义的   SELECT   语句的选择列表相匹配。例如:  
   
  CREATE   VIEW   EmployeeNames   (EmployeeID,   LName,   FName)  
  AS  
  SELECT   EmployeeID,   LastName,   FirstName  
  FROM   Northwind.dbo.Employees  
   
  视图的结果集有三列:一个   int   列和两个   nvarchar   列。传递到在视图上定义的   INSTEAD   OF   触发器的   inserted   和   deleted   表也具有名为   EmployeeID   的   int   列、名为   LName   的   nvarchar   列和名为   FName   的   nvarchar   列。  

create   trigger   t_test   on   表  
  for   update  
  as  
  if   update(判断是否更新的字段)    
  begin  
          select   更改前的字段值=判断是否更新的字段   from   deleted  
          select   更改后的字段值=判断是否更新的字段   from   inserted  
  end   


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值