sql server触发器

最近在使用触发器实现数据同步,中间遇到两个问题
问题一 大字段不能出现在after定义的触发器的inserted,deleted表中,解决方法修改字段的属性值为nvarchar(max),但是instead of没有这个限制
问题二 instead of 与 after的区别

INSTEAD OF 触发器

    用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEAD OF 触发器的动作要早于表的约束处理。
INSTEAD OF 触发器的操作有点类似于完整性约束。在对数据库的操纵时,有些情况下使用约束可以达到更好的效果,而如果采用触发器,则能定义比完整性约束更加复杂的约束。有关触发器与约束的比较,请参见联机丛书。
INSTEAD OF 触发器不仅可在表上定义,还可在带有一个或多个基表的视图上定义,但在作为级联引用完整性约束目标的表上限制应用。


AFTER 触发器

     定义了对表执行了 INSERT、UPDATE 或 DELETE 语句操作之后再执行的操作。比如对某个表中的数据进行了更新操作后,要求立即对相关的表进行指定的操作,这时就可以采用 AFTER 触发器。AFTER 触发器只能在表上指定,且动作晚于约束处理。
每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。

 

 

 

CREATE  TRIGGER  t_dalii  ON  [dbo].[员工明细表]   
FOR  INSERT 
AS 
declare  @v_char1  varchar(20),@v_char2  varchar(20),@v_char3  int,@v_char4  varchar(20),@v_char5  datetime 
begin 
       set  @v_char1=(select  所属部门  from  inserted) 
       if  @v_char1<>null 
           begin 
                     if    exists(select  部门号  from    部门状态表  where  部门
=@v_char1
                           set  @v_char2=(select  部门号  from    部门状态表  where  部门
=@v_char1
                   else 
                           set  @v_char2=((select    max(部门号)  from    部门状态表  )+1) 
           end 
           set  @v_char3=(select  编号  from  inserted) 
           set  @v_char4=(select  姓名  from  inserted) 
           set  @v_char5=(select  入厂时间  from  inserted) 
           insert  into  部门人员表  (部门号,部门,编号,姓名,员工属性,进部门时间,是否在职,是否下岗  ) 
           values(@v_char2,@v_char1,@v_char3,@v_char4,''职员'',@v_char5,''是'',''否'') 
end 
---------------------------------------------------------------  
 
create  trigger  tr_name   on  table/view 
{for    ¦  after    ¦  instead  of  }  [update][,][insert][,][delete] 
[with  encryption] 
as  {batch    ¦  if  update  (col_name)  [{and  ¦or}  update  (col_name)]  } 

说明:

1    tr_name  :触发器名称 
2  on  table/view  :触发器所作用的表。一个触发器只能作用于一个表 
3  for  和after  :同义 
4  after  与instead  of  :sql  2000新增项目 
afrer  与  instead  of  的区别 
After                                                    Instead  of 
在触发事件发生以后才被激活                代替了相应的触发事件而被执行 
只可以建立在表上                                  既可以建立在表上也可以建立在视图上 

 
5  insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一 
6  if  update  (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete  操作只对行有影响,所以如果使用delete 
操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。 
7  触发器执行时用到的两个特殊表:deleted  ,inserted 
   deleted  和inserted  可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一样的,只是存放  的数据有差异。 
 
--------------------------------------------------------------- 
 
for  update  修改时激发   
for  insert  插入数据时激发 
for  delete  删除数据时激发 
deleted  有变动的数据的修改前数据集 
inserted 有变动的数据的修改后数据集 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值