精华内容
下载资源
问答
  • 触发器缺点

    千次阅读 2017-07-05 20:31:41
    触发器主要是用来同步更新数据,触发器是一种特殊存储过程。 一般存储过程是通过存储过程名直接调用,而触发器主要是  通过事件(增、删、改)进行触发而被执行。其在表中数据发生变化时自动强制...

    触发器,主要是用来同步更新数据的,触发器是一种特殊的存储过程。

    一般的存储过程是通过存储过程名直接调用,而触发器主要是

      通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。

      常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。

      after(for)        表示执行代码后,执行触发器

      instead of        表示执行代码前,用已经写好的触发器代替你的操作

    触发器语法:

      create trigger 触发器的名字   on 操作表

      for|after         instead of

      update|insert|delete

      as

      SQL语句


    举个例子吧: 


    假设有两个表,tab_1 , tab_2 
    再假设两个表里都有“人员性别”这个字段 

    tab_1的数据例如: 张三```男```1978`````2002 
    tab_2的数据例如: 张三```男```销售科```科长 

    我要改tab_1中张三的性别为“女”的话,那么tab_2的性别也该改为“女”,对吧,总不能两张表的性别不同吧。 

    如果不用触发器的话,我们就要改完tab_1,再去改tab_2,使性别都变成女 

    于是这里可以用到触发器了: 

    原理是:当tab_1中某人的性别发生变更后,数据库自动将tab_2的性别进行同步修改 

    触发器也可以这样应用: 
    1、当删除tab_1中的某人信息时,触发器一并删除该人的tab_2中的数据 
    2、在tab_1中新插入一个人员时,触发器在tab_2中一并新增一条该人的数据 

    =================================================================================== 
    所以在你建立触发器时,就要指定该触发器的用途,是同步更新,还是删除、插入,由你指定。 

    基本的语法规则是: 
    create trigger 触发器名称(你自己命名的) on 表 for 用途(delete|update|insert) 
    as 
    delete|update|insert语句 
    ---------------------------------------------------------------------- 
    例如: 
    create trigger tri_A on tab_1 FOR DELETE 
    AS 
    delete tab_2 from deleted where tab_2.id = deleted.id; 

    意思是:在tab_1表上,建立触发器(tri_A),用于删除该表的数据时触发一个事务,什么事务呢?——删除tab_2中的该编号人员的记录。 

    FOR INSERT、FOR UPDATE分别是建立用于“插入记录”、“更新数据”的触发器,例子里的FOR DELETE是用于触发“删除记录”的。 

    这里还要看清楚,那个delete语句中的表,是from deleted哦,还有,where子句的tab_2.id = deleted.id,不是tab_2.id = tab_1.id哦,deleted.id是指你刚删除的那条记录的id(而update、insert,都用inserted.id) 
    =================================================================================== 

    好处:相对于外部程序、存储过程,触发器可以更快更高效的维护数据
    坏处:(我自己的经验)触发器要用的恰到好处,一个大型应用里,触发器越少越好,触发器会使编程时源码的结构被迫打乱,为将来的程序修改、源码阅读带来很大不便
    展开全文
  • 一、简单的库内表同步场景此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL语句。每当与表相...

    4048eb31f3f89b445ef62d7d30ef3c8e.png

    MySQL数据同步是目前数据库使用中比较常见的场景,其技术成熟,应用广泛。

    本文介绍两种基础的数据单向同步方式,以应对不同的场景和需求,对比两种方案的优缺点,总结应用场景。

    一、简单的库内表同步场景

    此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。

    这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的事件发生时,就会触发SQL触发器语句,从而实现对数据的同步。

    253b962fba340d2cd79fe2afc764887d.png

    下面以简单的实例展示如何使用触发器同步数据。

    首先,新建两个需要同步的数据库以及相同结构的表:

    e585f854857af835d59f6e80d2b45abd.png

    在需要同步的数据库和表上新建一个insert动作之后的触发器:

    53fe0b8e75d8e4bc3a641968586f936e.png

    使用 show triggers 查看新建的触发器:

    5ef2650656fa630681bd27c6414bfdc9.png

    新增数据并测试:

    eb587045499c62a73149ac673c6b4e9f.png

    这里对temp_db数据库的 temp_for_sync 表新增数据,而temp_db1中的temp_for_sync表也有新增的记录同步过来了,说明insert触发器生效了。

    update和delete触发器实例如下:

    2b2f690310928a2f162036a914dd2a98.png

    注意:触发器同步来的数据,只能做到单向同步,所以同步来的数据必须是只读的,否则会引发数据一致性问题,此外,对于复杂的业务场景,

    触发器可能会造成一定性能问题,所以,这个方案仅适合于简单的同步场景,对于有性能要求或者较为复杂的场景并不适用。

    二、使用MySQL的主从同步方法

    binlog简介:MySQL的binlog日志作用是用来记录MySQL内部增删改查等对MySQL数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录。主要用于数据库的主从复制以及增量恢复。

    基于binlog的主从同步流程如下:

    1.主服务器(master)将变更事件(更新、删除、表结构改变等等)写入二进制日志(master log)。

    2.从服务器(slave)的IO线程从主服务器(binlog dump线程)获取二进制日志,并在本地保存一份自己的二进制日志(relay log)

    3.从服务器的SQL线程读取本地日志(relay log),并重演变更事件。

    下面简要介绍主从同步的配置方法:

    主库,本地MySQL服务器 IP: 192.168.99.215

    从库,本地MySQL服务器 IP: 192.168.98.159

    第一步,配置主库信息:

    主库配置,新增以下配置项,完成bin_log的配置:

    09ca81f4275514fa9d661089c0b9a004.png

    这里注意 server-id要唯一。

    重启服务并查看主库状态:

    723885c8e538072312d80efd2a2121c0.png

    给从库赋权,以读取binlog从而同步数据:

    0e6ee4f59121d9697beb65b9eb823235.png

    主库配置完成。

    第二步,配置从库信息:

    配置从库信息server_id并重启从库:

    eb209c7e7b144fd7eb5cc4352cd1e908.png

    在主库配置从库关于主库的信息,并开启同步主库:

    8ae46e7c7805421bed2c8ced3dcabfe5.png

    验证同步效果,在主库新建库,表,记录,删除:

    6b7b01a9e3d1dca0f533f070e2cb38bc.png

    至此,完成了单向主从同步的基本配置。

    feca58c2c55b5fede9f159ab2e0b0d81.png

    三、两种方案的对比

    这两种方法都可以实现需求,而且各有优劣:

    触发器的实现比较简单,不需要另外新启动一个MySQL实例,对资源的消耗比较小,适合简单的业务场景,缺点在于字段有变更时,需要及时修改表结构,以及触发器的实现。

    主从不需要关系表结构的修改,只需要配置,缺点在于需要新启MySQL服务实例,会消耗一定资源,适合业务比较复杂的场景。

    展开全文
  • 这就结合了双方面优点,很好克服了异步复位的缺点(因为异步复位问题主要出现在复位信号释放时候,具体原因可见上文)。其实做起来也并不难,我推荐一种我经常使用方式吧:那就是在异步复位键后加上一个所谓...

    2:推荐的复位方式

    所谓推荐的复位方式就是上文中所说的:“异步复位,同步释放”。这就结合了双方面的优点,很好的克服了异步复位的缺点(因为异步复位的问题主要出现在复位信号释放的时候,具体原因可见上文)。

    其实做起来也并不难,我推荐一种我经常使用的方式吧:那就是在异步复位键后加上一个所谓的“reset synchronizer”,这样就可以使异步复位信号同步化,然后,再用经过处理的复位信号去作用系统,就可以保证比较稳定了。reset sychronizer的Verilog代码如下:

    module Reset_Synchronizer

    (output reg rst_n, input clk, asyncrst_n);

    reg rff1;

    always @ (posedge clk , negedge asyncrst_n) begin

    if (!asyncrst_n) {rst_n,rff1} <= 2'b0;

    else {rst_n,rff1} <= {rff1,1'b1};

    end

    endmodule

    大家可以看到,这就是一个dff,异步复位信号直接接在它的异步复位端口上(低电平有效),然后数据输入端rff1一直为高电平‘1’。倘若异步复位信号有效的话,触发器就会复位,输出为低,从而复位后继系统。但是,又由于这属于时钟沿触发,当复位信号释放时,触发器的输出要延迟一个时钟周期才能恢复成‘1’,因此使得复位信号的释放与时钟沿同步化。

    此外,还有一种方法更为直接,就是直接在异步复位信号后加一个D触发器,然后用D触发器的输出作为后级系统的复位信号,也能达到相同的效果。这里就不多说了。

    3:多时钟系统中复位的处理方法

    这是一个很实际的问题,因为在较大型的系统中,一个时钟驱动信号显然不能满足要求,一定会根据系统的要求用多个同源时钟(当然也可以是非同源了)去驱动系统的不同部分。那么在这样的多时钟系统中,复位键怎么设置?它的稳定与否直接关系到了整个系统的稳定性,因此要格外注意(在我看来,复位信号在同步时序系统中的地位和时钟信号一样重要)。下面就说一下具体的处理方法,当然所遵循的原则就仍应该是上文的“异步复位,同步释放”:

    1.non-coordinated reset removal:顾名思义,就是同一个系统中的多个同源时钟域的复位信号,由彼此独立的“reset synchronizer”驱动。当异步复位信号有效时,各时钟域同时复位,但是复位释放的时间由各自的驱动时钟决定,也是就说:时钟快的先释放,时钟慢的后释放,但是各复位信号之间没有先后关系。

    2.sequence coordinated reset removal:这是相对于上述方式来说的,也就是说各时钟域的复位信号彼此相关,各个部分系统虽然也同时复位,但是却分级释放。而分级的顺序可由各个“reset synchronizer”的级联方式决定。可以先复位前级,再复位后级,也可以反过来。反正方式很灵活,需要根据实际需要而定。由于图片上传问题,我只能用程序表示了,

    例子:三级复位系统,系统中的时钟分别为1M,2M,11M:

    第一级Reset_Sychronizer程序:

    module Reset_Synchronizer

    (output reg rst_n,

    inputclk, asyncrst_n);

    reg rff1;

    always @ (posedge clk , negedge asyncrst_n)

    begin

    if (!asyncrst_n) {rst_n,rff1} <= 2'b0;

    else {rst_n,rff1} <= {rff1,1'b1};

    end

    endmodule

    第2,3级的Reset_Sychronizer程序:

    module Reset_Synchronizer2

    (output reg rst_n,

    inputclk, asyncrst_n,d);

    reg rff1;

    always @ (posedge clk , negedge asyncrst_n) begin

    if (!asyncrst_n) {rst_n,rff1} <= 2'b0;

    else {rst_n,rff1} <= {rff1,d};

    end

    endmodule

    顶层模块的源程序:

    include "Reset_Synchronizer.v"

    include "Reset_Synchronizer2.v"

    module AsynRstTree_Trans

    ( inputClk1M,Clk2M,Clk11M,SysRst_n,

    output SysRst1M_n,SysRst2M_n,SysRst11M_n

    );

    Reset_Synchronizer Rst1M(.clk(Clk1M),. asyncrst_n(SysRst_n),.rst_n(SysRst1M_n));

    Reset_Synchronizer2Rst2M(.clk(Clk2M),.d(SysRst1M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst2M_n));

    Reset_Synchronizer2Rst11M(.clk(Clk11M),.d(SysRst2M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst11M_n));

    endmodule

    展开全文
  • 一、简单的库内表同步场景此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL语句。每当与表相...

    MySQL数据同步是目前数据库使用中比较常见的场景,其技术成熟,应用广泛。

    本文介绍两种基础的数据单向同步方式,以应对不同的场景和需求,对比两种方案的优缺点,总结应用场景。

    一、简单的库内表同步场景

    此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。

    这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的事件发生时,就会触发SQL触发器语句,从而实现对数据的同步。

    8b226b70ce8f114c2ef2544a7453e13a.png

    下面以简单的实例展示如何使用触发器同步数据。

    首先,新建两个需要同步的数据库以及相同结构的表:

    e26fc08700dd38cd4919c2044acc0dd6.png

    在需要同步的数据库和表上新建一个insert动作之后的触发器:

    0031f41109a5cc326becd17764d9dcdb.png

    使用 show triggers 查看新建的触发器:

    0dcba26f09215086bd18005896be89ed.png

    新增数据并测试:

    98512e0e49ad793eff50ba1ed3d0797c.png

    这里对temp_db数据库的 temp_for_sync 表新增数据,而temp_db1中的temp_for_sync表也有新增的记录同步过来了,说明insert触发器生效了。

    update和delete触发器实例如下:

    3a43ffaa602acc0cc742acf3bda1158c.png

    注意:触发器同步来的数据,只能做到单向同步,所以同步来的数据必须是只读的,否则会引发数据一致性问题,此外,对于复杂的业务场景,

    触发器可能会造成一定性能问题,所以,这个方案仅适合于简单的同步场景,对于有性能要求或者较为复杂的场景并不适用。

    二、使用MySQL的主从同步方法

    binlog简介:MySQL的binlog日志作用是用来记录MySQL内部增删改查等对MySQL数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录。主要用于数据库的主从复制以及增量恢复。

    基于binlog的主从同步流程如下:

    1.主服务器(master)将变更事件(更新、删除、表结构改变等等)写入二进制日志(master log)。

    2.从服务器(slave)的IO线程从主服务器(binlog dump线程)获取二进制日志,并在本地保存一份自己的二进制日志(relay log)

    3.从服务器的SQL线程读取本地日志(relay log),并重演变更事件。

    下面简要介绍主从同步的配置方法:

    主库,本地MySQL服务器 IP: 192.168.99.215

    从库,本地MySQL服务器 IP: 192.168.98.159

    第一步,配置主库信息:

    主库配置,新增以下配置项,完成bin_log的配置:

    e7671f1be81bc7968b9ffc24bcc6acd1.png

    这里注意 server-id要唯一。

    重启服务并查看主库状态:

    c9d70bbf96d1e6dd6bd4f2c28d7eeabd.png

    给从库赋权,以读取binlog从而同步数据:

    33d20bc7f3d312da5d3d1d3f63f29dd7.png

    主库配置完成。

    第二步,配置从库信息:

    配置从库信息server_id并重启从库:

    74d66e8333f8d326d248eef017e0f27c.png

    在主库配置从库关于主库的信息,并开启同步主库:

    17930fca0ee67abb6fdc51b9a5d0284f.png

    验证同步效果,在主库新建库,表,记录,删除:

    8e96ccd04ea54ec42bd371955c7d72d2.png

    至此,完成了单向主从同步的基本配置。

    27841572a23bb5a01900b80da2478326.png

    三、两种方案的对比

    这两种方法都可以实现需求,而且各有优劣:

    触发器的实现比较简单,不需要另外新启动一个MySQL实例,对资源的消耗比较小,适合简单的业务场景,缺点在于字段有变更时,需要及时修改表结构,以及触发器的实现。

    主从不需要关系表结构的修改,只需要配置,缺点在于需要新启MySQL服务实例,会消耗一定资源,适合业务比较复杂的场景。

    展开全文
  • 一、简单的库内表同步场景此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL...
  • 一、简单的库内表同步场景此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL语句。每当与表相...
  • 一、简单的库内表同步场景此场景的主要特点是数据量不大,结构比较简单,而且没有跨数据库实例的情况,适合使用触发器实现。这里先对触发器做一个简单的介绍:触发器是存储在数据库目录中的一组SQL语句。每当与表相...
  • 同步时序设计原则

    2020-07-31 23:40:24
    同步时序设计原则 同步设计是 PLD ASIC 设计的最重要原则。...(2)电路的主要信号、输出信号等并不依赖于任何一个时钟性信号,不是由时钟信号驱动触发器(FF)产生的. (3)异步时序电路的最大缺点是容易产
  • SOC中复位电路

    千次阅读 2019-11-19 14:38:07
    对电路的复位往往是指对触发器的复位,也就是说电路的复位中的这个“电路”,往往是指触发器,这是需要注意的。有的电路需要复位信号,就像是有的电路需要时钟信号那样,而有的电路是不需要复位信号的。复位又分为...
  • ASP.Net MVC是微软推出区别于ASP.Net WebFormWeb开发新技术,由于ASP.Net MVC解决了ASP.Net WebForm很多缺点,非常适合大型、中型项目开发,一经推出就受到了.Net开发社区追捧,很多.Net开发人员职位...
  • CruiseYoung提供带有详细书签电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 特别说明:该版本是目前网络上最全版本:修正了所有缺页和错页问题。 Oracle Database 11g完全参考手册 ...
  • 1、触发器的作用? 40 2、什么是存储过程?用什么来调用? 40 3、存储过程的优缺点? 40 4、存储过程与函数的区别 41 5、索引的作用?和它的优点缺点是什么? 41 6、什么样的字段适合建索引 41 7、索引类型有哪些? ...
  • java面试宝典

    2013-02-28 16:04:01
    182、Request对象的主要方法 43 183、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 43 184、Servlet执行时一般实现哪几个方法? 44 185、getServletContext...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    182、Request对象的主要方法 43 183、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 43 184、Servlet执行时一般实现哪几个方法? 44 185、getServletContext...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    8、Request对象的主要方法: 87 9、forward 和redirect的区别 87 10、request.getAttribute() 和 request.getParameter() 有何区别? 88 11. jsp有哪些内置对象?作用分别是什么? 分别有什么方法? 88 12. jsp有哪些...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    8、Request对象的主要方法: 87 9、forward 和redirect的区别 10、request.getAttribute() 和 request.getParameter() 有何区别? 11. jsp有哪些内置对象?作用分别是什么? 分别有什么方法? 12. jsp有哪些动作?...
  • Access2000中文版高级编程 目录 第一部分 编程基础 1 第1章 宏与代码 3 ...14.3.2 查看ListView控件的主要属性组 444 14.3.3 人工设置ListView控件 445 14.3.4 使用VBA创建和填充ListView控件 ...
  • 8、Request对象的主要方法: 87 9、forward 和redirect的区别 87 10、request.getAttribute() 和 request.getParameter() 有何区别? 88 11. jsp有哪些内置对象?作用分别是什么? 分别有什么方法? 88 12. jsp有哪些...
  • asp.net知识库

    2015-06-18 08:45:45
    [ADO.NET]由数据库触发器引发问题 为ASP.NET封装SQL数据库访问类 DataTable.Select方法性能问题 .NET 2.0里使用强类型数据创建多层应用 ADO.NET实用经验无保留曝光 有了System.Data.IDataReader,一切皆成数据 ...
  • 2.4.7 VLAN的主要作用有? 2.4.8 在交换机中用户权限分为几个级别? 2.4.9 在路由器的配置过程中查询以S开头所有命令的方法是? 2.5.0 第一次配置路由器时可以使用的方法为? 2.5.1 在何种状态下可以为路由器...
  • 该协议的主要层次结构? Tcp/Ip协议 主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。 11.Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 12.IP...
  •  3.17.2 使用裸设备的缺点  3.18 磁盘I/O其他注意事项和提示  3.19 设计阶段需要注意问题  3.20 技巧回顾  3.21 参考文档  第4章 用初始参数调整数据库(针对DBA)  4.1 标识重要初始参数  4.2 不用重启...
  • 书中内容主要集中在大多数企业常见问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据、数据库备份与恢复、性能调优,等等。  本书还提供了dba完成本职工作必备基本uniix...
  • Java 面试宝典

    2013-02-01 10:02:08
    38、try {}里有一个 return 语句,那么紧跟在这个 try 后 finally {}里 code 会不 会被执行,什么时候被执行,在 return 前还是后? .................................................... 25 39、下面程序...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

同步触发器的主要缺点