`

用触发器处理两表同步问题

阅读更多
http://topic.csdn.net/t/20041028/09/3498141.html


有A、B两表。B表中记录取自A表   
  A:   
  ID(PK),     Name,     Sex,     Job,     Address,   ….   
  B:   
  ID(PK),     Name,     Address   
    
  现想在A上建立触发器,当A中记录发生增加、某个字段(Address)发生更新、记录删除时,对B中的记录进行相应的增加、更新和删除的工作。请问邹建大哥及各位老大,是写成单个触发器还是写成三个触发器好呢?如果写成单个触发器,请问这个触发器怎么写?   我碰到的问题是不知如何在触发器中区分三个不同的操作。请大家帮忙。。。   





--写成三个吧,免得在触发器中去判断属于那种操作   
    
  --新增同步   
  create   trigger   tr_insert_A   on   A   
  for   insert   
  as   
  insert   B(ID,Name,Address)   select   ID,Name,Address   from   inserted   
  go   
    
  --删除同步   
  create   trigger   tr_delete_A   on   A   
  for   delete   
  as   
  delete   B   from   deleted   d   where   B.ID=d.ID   
  go   
    
  --更新同步   
  create   trigger   tr_update_A   on   A   
  for   update   
  as   
  if   update(Name)   or   update(Address)   
  update   B   set   Name=i.Name,Address=i.Address   
  from   B,inserted   i,deleted   d   
  where   i.ID=d.ID   and   i.ID=b.ID   





谢谢邹建大哥。再问一下,三个触发器与单个触发器相比,性能上会有所不如吗?   
  另外,如果是这样的两个表,我又应该怎样做呢?呵呵,主要A的关键字段变了   
  有A、B两表。B表中记录取自A表   
  A:   
  Name(PK),     Sex,     Job,     Address,   ….   
  B:   
  ID(PK),     Name,     Address   


很少来SQL   SERVER版   ,不过邹建大名可是如雷贯耳,看你们帖子真长知识呀!!!   
    
  请教写成一个触发器怎么写?




某个字段(Address)发生更新   
  create   trigger   tr_update_A   on   A   
  for   update   
  as   
  if     update(Address)   
  begin   
          update   B   set   Name=i.Name,Address=i.Address   
          from   B,inserted   i,deleted   d     where   i.ID=d.ID   and   i.ID=b.ID   
  end   
    
  go     
     
    
  删除   
  create   trigger   tr_delete_A   on   A   
  for   delete   
  as   
  delete   B   from   deleted   d   where   B.ID=d.ID   
  go



俺不是老大,首先声明~   
  关键字变了无所谓的。   
  看你的id是自增字段,还是一定长度的编号了。   
  如是自增字段,你可以这样写:   
  --新增同步   
  create   trigger   tr_insert_A   on   A   
  for   insert   
  as   
  insert   B(Name,Address)   select   Name,Address   from   inserted   
  go   
    
  --删除同步   
  create   trigger   tr_delete_A   on   A   
  for   delete   
  as   
  delete   B   from   deleted   d   where   B.name=d.name   
  go   
    
  --更新同步   
  create   trigger   tr_update_A   on   A   
  for   update   
  as   
  if   update(Address)   
  update   B   set   Address=i.Address   
  from   B,inserted   i,deleted   d   
  where   i.name=d.name   and   i.name=b.name   
    
  如id字段是按某种规则生成的编号,基本一样,只要在增加时,生成编号就可以了。



--写成一个触发器要判断当前操作是什么类型,所以在效率上没有三个好   
    
    
    
  --写成一个触发器,顺便体现你最后的表的解决方法   
    
  create   trigger   tr_insert_update_delete_A   on   A   
  for   insert,update,delete   
  as   
  if   not   exists(select   *   from   deleted)   --如果是新增   
  insert   B(Name,Address)   select   Name,Address   from   inserted   
  else   if   not   exists(select   *   from   inserted)   --如果是删除   
  delete   B   from   deleted   d   where   B.Name=d.Name   
  else   if   update(Name)   or   update(Address)     --如果是更新   
  update   B   set   Name=i.Name,Address=i.Address   
  from   B,inserted   i,deleted   d   
  where   i.Name=d.Name   and   i.Name=b.Name   



邹建大哥写的触发器Insert和Delete都没有问题,但是在Update情况下会有如下问题:A表的关键字段Name更新时,B表的Name字段无法更新!!这个问题要怎么解决呢??



create   trigger   tr_insert_update_delete_A   on   A   
  for   insert,update,delete   
  as   
  declare   @r   int   
  set   @r=@@rowcount   
  if   @r=0   return   
  if   not   exists(select   *   from   deleted)   --如果是新增   
  insert   B(Name,Address)   select   Name,Address   from   inserted   
  else   if   not   exists(select   *   from   inserted)   --如果是删除   
  delete   B   from   deleted   d   where   B.Name=d.Name   
  else   if   update(Name)   and   @r>1   --如果更新了Name,则不允许多行,否则不能实现同步   
  begin   
  raiserror('不允许同时更新多条记录的主键值,更新被取消!',1,16)   
  rollback   tran   
  return   
  end   
  else   if   update(Name)   
  update   B   set   Name=i.Name,Address=i.Address   
  from   B,inserted   i,deleted   d   
  where   B.Name=D.Name   
  else   if   update(Address)   
  update   B   set   Name=i.Name,Address=i.Address   
  from   B,inserted   i,deleted   d   
  where   B.Name=D.Name   and   i.Name=d.Name    
 
 
分享到:
评论

相关推荐

    实验六-触发器实验报告.doc

    SQL DML 语句 ( INSERT、 DELETE 或 UPDATE) AFTER 指定了触发器在处理完成后触发 BEFORE 指定了触发器在处理完成前触发 默认情况下,触发器每个表触发一次 FOR EACH ROW 选项指定触发器每行触发一次(即触发器为...

    生产任务单更新生产投料单的触发器

    嵌套处理 ISNULL 空值字符串联接 K3中的应用 高手不要下了

    pgsync:将数据从一个Postgres数据库同步到另一个数据库

    便利性-同步部分表,表组和相关记录 :tangerine: 经过战斗测试 安装 pgsync是一个命令行工具。 要安装,请运行: gem install pgsync 这将为您提供pgsync命令。 如果安装失败,则可能需要安装。 建立 在您的项目...

    数字通信同步技术的MTALAB与FPGA实现》PPT版

    7.2.5 单稳触发器的VHDL实现 241 7.2.6 控制及分频模块的VHDL实现 243 7.2.7 位同步形成及移相模块的VHDL实现 244 7.2.8 FPGA实现及仿真测试 246 7.3 积分型位同步的FPGA实现 248 7.3.1 积分型位同步的原理 248...

    单片机与DSP中的基于AT89C52单片机的晶闸管触发器的设计

    一般的触发装置往往只采集一相同步信号,然后经单片机处理送出带有一定导通角α的六路脉冲控制信号,这无疑对三相交流电有一定的误差。本设计同时采集三相的同步脉冲信号,避免了只检测一相而造成的延时。同时,系统...

    基于AT89C52单片机的晶闸管触发器的设计

    一般的触发装置往往只采集一相同步信号,然后经单片机处理送出带有一定导通角α的六路脉冲控制信号,这无疑对三相交流电有一定的误差。本设计同时采集三相的同步脉冲信号,避免了只检测一相而造成的延时。同时,系统...

    SALSA Version: 2.1.0

    混合和匹配混合变形、变换、精灵、纹理、动画器触发器、C# 事件等,以创建无限视位和表情表达。表情组件可以在模块内和模块间复用,不会冲突。该套件包含三个产品模块,以简化 2D/3D 口型同步、眼睛/头部移动和表情...

    unity SALSA LipSync Suite2.5.4

    混合和匹配混合变形、变换、精灵、纹理、动画器触发器、C# 事件等,以创建无限视位和表情表达。表情组件可以在模块内和模块间复用,不会冲突。该套件包含三个产品模块,以简化 2D/3D 口型同步、眼睛/头部移动和表情...

    基于FPGA设计跨时钟域的同步策略

    如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法运行。本文总结出了几种同步策略来解决跨时钟域问题。  2 异步设计中的亚稳态  触发器是FPGA设计中常用的基本器件。...

    EDA/PLD中的基于FPGA设计跨时钟域的同步策略

    如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法运行。本文总结出了几种同步策略来解决跨时钟域问题。  2 异步设计中的亚稳态  触发器是FPGA设计中最常用的基本器件...

    面向移动计算环境的混合式数据同步机制

    还提出了基于轨迹变更的增量捕获策略,采用触发器捕获操作日志,用净化方法合并操作日志得到净增量数据。实验结果表明,混合式数据同步机制能更好地维护移动计算环境中数据的一致性,缩短同步响应时间,减少同步数据...

    提高同步系统的运行速度

    同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。我们先来看一看同步电路中数据传递的一个基本模型:如下图 Tco是触发器时钟到数据输出的延时;Tdelay是组合逻辑的延时;Tsetup是...

    database.rar

    而原方案使用触发器获取数据变化。 3、yugong的applier部分(更新到目标库),同样使用jdbc,直接把转化后的数据更新入目标库;而原方案利用java source把变化数据发送给外部程序处理。 4、yugong引入了Translator,...

    多时钟域下同步器的设计与分析

    摘 要:本文提出了多时钟域逻辑设计中的一般问题,介绍了异步电路设计中同步化处理的重要作用,分析了触发器失效的原因和几种可行的解决亚稳态失效的方法。  引言  在数字电路设计中,大部分设计都是同步时序...

    常见的硬件笔试面试题目3

    这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。这样做只能防止亚稳态传播,但...

    SQLServer2000高级编程技术(part02)-想学存储过程 SQL编程 务必要看

    10.4.1 使用临时表来传递一个记录集给一个嵌套的存储过程 10.4.2 使用光标来传递一个记录集给一个嵌套的存储过程 10.5 如何处理一个存储过程的结果集 10.6 使用标识值 10.6.1 一个标准问题及解答 10.6.2 标识值与...

    SQLServer2000高级编程技术-已添加书签,想学存储过程、SQL编程务必要看,分析非常透彻

    10.4.1 使用临时表来传递一个记录集给一个嵌套的存储过程 10.4.2 使用光标来传递一个记录集给一个嵌套的存储过程 10.5 如何处理一个存储过程的结果集 10.6 使用标识值 10.6.1 一个标准问题及解答 10.6.2 标识值与...

    常见的硬件笔试面试题目2

    前者需要同步来实现,而后者根据不同的设计应用有不同的处理办法 题目是都用英文写的,我用汉字来表达 1, a为输入端,b为输出端,如果a连续输入为1101则b输出为1,否则为0 例如a:0001100110110100100110 b:...

    Access+2000中文版高级编程

    8.2.2 同一个表使用两次(自联接) 189 8.2.3 使用Access的自动查阅功能 191 8.3 运用操作查询:力量的源泉 193 8.3.1 生成表查询(SELECT INTO) 193 8.3.2 追加查询 194 8.3.3 更新查询(UPDATE..SET) ...

    Access 2000中文版高级编程(part1)

    8.2.2 同一个表使用两次(自联接) 189 8.2.3 使用Access的自动查阅功能 191 8.3 运用操作查询:力量的源泉 193 8.3.1 生成表查询(SELECT INTO) 193 8.3.2 追加查询 194 8.3.3 更新查询(UPDATE..SET) 195 ...

Global site tag (gtag.js) - Google Analytics