`

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

阅读更多
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    
 
 
分享到:
评论

相关推荐

    基于触发器和控制表的数据库同步系统

    本系统由Java语言开发,专注于MySQL数据库之间的表数据同步,但不处理表结构的同步问题。在了解这个系统之前,我们先来详细探讨相关知识点。 1. **触发器(Triggers)**:触发器是数据库管理系统中的一个重要概念,...

    通过触发器实现数据库同步(原创)

    以下是一个简单的触发器示例,用于将`dbo.regs`表中的新数据同步到另一个数据库中的相同表: ```sql ALTER TRIGGER trigger_Reg_insert ON [dbo].regs FOR INSERT AS BEGIN INSERT INTO OPENROWSET('SQLOLEDB', '...

    子表+触发器实现数据同步

    本示例通过使用子表和触发器来实现表A与表B之间的数据插入同步,以达到实时更新的效果。以下是对这个机制的详细解释: 1. **子表(CHILD表)**: 子表CHILD是用于存储表A和表B之间同步信息的中间表。它有四个字段...

    mssql数据库和oracle数据库通过触发器实现数据表同步

    ### mssql数据库与oracle数据库通过触发器实现数据表同步 #### 概述 在实际的企业应用环境中,常常需要实现不同数据库平台之间的数据同步。本文档将详细介绍如何利用触发器技术来实现在Microsoft SQL Server(简称...

    锁相同步触发器的设计

    ### 锁相同步触发器的设计 #### 一、引言 锁相同步触发器作为一种重要的控制组件,在变流领域有着广泛的应用。特别是在大容量可控整流系统中,为了减少变流装置高频电流对电网的干扰并降低其对其他监测和保护设备...

    可编程硬件描述语言VHDL Quartus 同步D触发器源代码.pdf

    在给定的文件中,我们看到一个使用VHDL编写的同步D触发器的源代码,这个触发器是针对Altera的Quartus II软件平台设计的。Quartus II是一款流行的、用于FPGA(Field-Programmable Gate Array)和CPLD(Complex ...

    VHDL同步复位的D触发器

    使用仿真工具(如ModelSim、GHDL等)对设计进行模拟,验证D触发器在各种输入条件下的正确行为,包括不同时钟周期和复位信号的不同状态。 6. **应用**: 同步复位的D触发器广泛应用于数字电路设计,如计数器、移位...

    SQLServer触发器实现不同服务器数据同步.pdf

    SQL Server 触发器实现不同...本文提供了一个使用 SQL Server 触发器实现不同服务器之间的数据同步的解决方案,涉及到了多个知识点,包括 SQL Server 触发器、分布式事务处理服务、链接服务器、存储过程和作业等。

    多表操作之触发器

    当一个操作(如插入、更新或删除记录)对某个表进行时,触发器可以自动检查其他相关表的数据状态,并根据需要执行额外的操作来保持整个数据库系统的同步与协调。 ### 触发器在多表操作中的作用 1. **数据一致性**...

    Oracle触发器备份表数据

    综上所述,使用Oracle触发器备份表数据是一种高效且灵活的方法,但同时也需要注意其潜在的局限性和挑战。通过合理设计和优化触发器,可以有效提升数据备份的效率和安全性,为数据库管理提供有力的支持。

    触发器数据同步

    此外,触发器也可以用于同步相关表的数据,例如,在一个订单表中添加新订单后,可以触发更新库存表的相应操作。 在数据同步的场景中,触发器可以用来实现实时的数据复制或镜像。例如,一个数据库的主服务器上发生的...

    钟控同步RS触发器PPT课件.pptx

    在设计更高级的数字系统时,钟控同步RS触发器能够作为构建更复杂逻辑电路的基石,如触发器链、状态机和微处理器等。 总之,钟控同步RS触发器作为数字逻辑设计中的基础元件,不仅在理论教学中占有重要地位,而且在...

    mysql 触发器实现两个表的数据同步

    在本例中,我们将讨论如何使用MySQL触发器来实现两个表之间的数据同步。 首先,我们要理解触发器的基本概念。触发器由三部分组成:触发事件(如UPDATE)、触发时间(BEFORE或AFTER)和触发动作(即当事件发生时执行...

    触发器触发器触发器触发器

    例如,当一个表中的数据发生变化时,触发器可以确保关联表的数据同步,或者执行复杂的业务规则检查。在"触发器9.18触发器9.18触发器9.18触发器触发器9.18触发器9.18触发器9.18触发器"这个描述中,可能是在强调某个...

    触发器介绍及分类

    主从触发器是为了克服同步触发器的空翻问题而设计的。主从触发器内部包含主触发器和从触发器,主触发器先响应时钟,从触发器后响应,确保在每个时钟周期内状态只改变一次,增强了抗干扰能力。例如,主从RS触发器和...

    有关数据库触发器的实例

    触发器的关键在于理解和使用这两个临时表以及触发机制。在处理复杂的业务逻辑和数据关联时,触发器可以有效地维护数据的一致性和完整性。但是,过度使用触发器可能会导致性能问题,因为每次操作都会执行额外的SQL...

    飞机电子技术-同步触发器.pptx

    同步RS触发器的电路结构包括两个反相器和两个控制门(如G3和G4),当CP=0时,这些门被封锁,触发器状态保持不变。而在CP=1时,输入信号R和S可以决定触发器的输出状态。这意味着只有在时钟脉冲的高电平期间,即CP=1时...

    数据库的触发器实验报告书

    第二个触发器`CP_UPDATE`在CP表的`cpbh`字段更新时,同步更新XSCP表中的对应记录。这里使用了`inserted`和`deleted`表,`inserted`表存储更新后的新值,`deleted`表存储更新前的旧值。触发器比较这两个表中的`cpbh`...

    专用触发器 使用教程 PDF

    触发器的使用通常是为了满足用户在数据操作后立即执行特定业务规则的需求,或者是对整个表的数据进行批量处理。 【标签】包括"触发器"、"数据库"和"SQL Server",这暗示了本教程将深入探讨SQL Server数据库中的...

    SQL_两张表同步数据

    在企业级应用中,有时我们需要实现在两个不同的数据库之间进行数据同步,比如将一张表中的数据实时地复制到另一张表中,这种需求通常可以通过触发器(Trigger)来实现。本文将详细介绍如何通过创建触发器来监控两张...

Global site tag (gtag.js) - Google Analytics