幽灵谷

追求永无止境......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

通过视图更新数据表

Posted on 2010-04-13 10:04  zhb6022  阅读(531)  评论(0编辑  收藏  举报

 --示例  
   
  --测试数据  
  create   table   表1(ID   int   identity(1,1),A   varchar(10),B   varchar(10),C   varchar(10),D   varchar(10)  
  ,CONSTRAINT   idx_表1_a   UNIQUE(a))  
  insert   表1   select   'a',   'b','c','d'  
  union     all   select   'a2','b','c','d2'  
  union     all   select   'a3','c','b','a'  
   
  create   table   表2(ID   int   identity(1,1),E   varchar(10),A   varchar(10),F   varchar(10),G   varchar(10)  
  ,CONSTRAINT   idx_表2_a   UNIQUE(a))  
  insert   表2   select   'm','a'   ,'w','q'  
  union     all   select   'x','a2','p','k'  
  union     all   select   'u','a3','i','r'  
  go  
   
  --视图  
  create   view   视图名  
  as  
  select   a.*,b.g  
  from   表1   a   join   表2   b   on   a.a=b.a  
  go  
   
  --处理的触发器  
  create   trigger   tr_process   on   视图名  
  instead   of   insert,update,delete  
  as  
  if   exists(select   1   from   inserted)  
  if   exists(select   1   from   deleted)  
  begin  
  select   id=identity(int,1,1),a,b,c,d,g   into   #i   from   inserted  
  select   id=identity(int,1,1),a   into   #d   from   deleted  
  update   表1   set   a=i_a,b=i_b,c=i_c,d=i_d  
  from   表1   a   join(  
  select   i_a=i.a,i_b=i.b,i_c=i.c,i_d=i.d,d_a=d.a  
  from   #i   i   join   #d   d   on   i.id=d.id  
  )b   on   a.a=d_a  
   
  update   表2   set   a=i_a,g=i_g  
  from   表2   a   join(  
  select   i_a=i.a,i_g=i.g,d_a=d.a  
  from   #i   i   join   #d   d   on   i.id=d.id  
  )b   on   a.a=d_a  
  end  
  else  
  begin  
  insert   表1(a,b,c,d)   select   a,b,c,d   from   inserted  
  insert   表2(a,g)   select   a,g   from   inserted  
  end  
  else  
  begin  
  delete   表1   from   表1   a   join   deleted   d   on   a.a=d.a  
  delete   表2   from   表2   a   join   deleted   d   on   a.a=d.a  
  end  
  go  
   
  --显示视图  
  select   *   from   视图名  
  go  
   
  --测试触发器  
  update   视图名   set   b=b+'bb',g=g+'gg'  
  insert   视图名   select   1,'aa','b','c','d','g'  
  delete   视图名   where   a='a2'  
  go  
   
  --显示处理结果  
  select   *   from   视图名  
  go  
   
  --删除测试  
  drop   view   视图名  
  drop   table   表1,表2  
   
  /*--测试结果  
   
  --视图的效果  
  ID                     A                     B                     C                     D                     g                      
  -----------   ----------   ----------   ----------   ----------   ----------    
  1                       a                     b                     c                     d                     q  
  2                       a2                   b                     c                     d2                   k  
  3                       a3                   c                     b                     a                     r  
   
  (所影响的行数为   3   行)  
   
   
  --触发器处理的效果  
  ID                     A                     B                     C                     D                     g                      
  -----------   ----------   ----------   ----------   ----------   ----------    
  1                       a                     bbb                 c                     d                     qgg  
  3                       a3                   cbb                 b                     a                     rgg  
  4                       aa                   b                     c                     d                     g  
   
  (所影响的行数为   3   行)  
   
  --*/