触发器 订阅
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。此外触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息等。 展开全文
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。此外触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息等。
信息
外文名
trigger
类    别
DDL触发器、DML触发器、登录触发器
作    用
写入数据表前,强制检验或转换数据
中文名
触发器
简    介
与表事件相关的特殊的存储过程
常规类型
DML 触发器、DDL 触发器等
触发器触发器的作用
触发器有如下作用:
收起全文
精华内容
参与话题
问答
  • 触发器

    千次阅读 2020-11-07 08:48:50
    前言: 我们已经实现了加减法,如果计算机要计算1+2+3,必须得先计算1+2,然后再把1+2得结果存起来,在去计算3...触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来(广义的触发器包括锁存器)。触发器...

    前言:

    我们已经实现了加减法,如果计算机要计算1+2+3,必须得先计算1+2,然后再把1+2得结果存起来,在去计算3+3.

    那么如何保存这个临时数据呢?

     

    1.触发器:

    触发器(Flip Flop)是一种可以存储电路状态的电子元件。最简单的是由两个或非门,两个输入端和两个输出端组成的RS触发器。

    触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来(广义的触发器包括锁存器)。触发器可以处理输入、输出信号和时钟频率之间的相互影响。

     

    我们得设计一个电路来让计算机保存这些临时数据:

    如下图,有两个或非门,或非门就是或门再取反,既只要输入端有1,结果就为0。输入全为0,输出才为1.

    观察该电路,红线表示输出为1。其实这个电路红线部分可以是0,也可以是1
    如果是1,那么灯泡灭,如果是0,则灯泡亮的。这里刚好用灯泡灭来做演示,也可以按着红线输出为0来推演,那么灯泡是亮的。
    当两个输入端V都为0时,先看右边的或非门,上面输入为1,下面为0,那么根据或非门,输出为0,灯泡灭,同时输出传递到左边的或非门,左边的或非门两个输入都为0,输出为1

     

    这种两个门的输出都作为另一个门的输入的连接方式称之为反馈。

     

    现在闭合上面的开关:

    或非门的特点,输入有1时,输出为0,那么左边的或非门输出为0,右边的或非门两个输入都是0,则输出为1,灯泡亮。同时将输出带到左边的或非门的输入中

    然后将上面的开关再打开:

    因为上面的输入为1,所以导致灯泡还是亮。这个图和第一个图是一样的,但是灯泡却不一样。

    这就是反馈和或非门结合的结果,此时不管再怎么操作上面的开关,灯泡永远都是亮的,因为或非门的特点:左边的或非门输入有1,则输出为0

    这个状态时,下面的开关不动,不管你如何操作上面的开关,输出永远是不变的

     

     

    假如此时闭合下面的开关:

    输入有1,输出既为0,灯泡灭,然后左边的两个输入为0,输出是1,使得右边的上面的输入变为1,灯泡依旧灭

     

    然后在打开下面的开关:

    由于上面的输入为1,所以灯泡还是灭的

    此时,不管你如何操作下面的开关,灯泡都是灭的,因为或非门的特点,输入有1,则输出为0。

    而这个状态就是第一幅图的状态。

    这个状态时,上面的开关不动,不管你如何操作下面的开关,输出永远是不变的。

     

    总结下这个电路:
    接通上面的开关,灯泡亮,断开此开关,灯泡依然亮着
    接通下面的开关,灯泡灭,断开此快开,灯泡依然灭着

    尽管看起来这个电路很神奇,但是很难总结出什么有用的信息,我们只须要记住,这种连接形式,能让电路记住某些信息

     

    接下来我们把这个电路绘制方式稍微改变一下,其实还是刚刚的电路,只不过把左边或非门的输出也画了出来,用_Q代表下面那个符号(因为那个符号打不出来) 

    这个电路和上面的电路一样,被称为R-S触发器(Reset-Set)

    根据或非门的特点,当R=1时,Q为0;当S为1时,_Q为0。这个很容易推断出来

    当R=1时,Q为0,同时,S的上输入也为0,若S为1,那么不用看了,_Q必定为0,所以看S=0时,两个输入都为0,_Q为1

    既                   R=1,S=0; Q=0,_Q=1
    反之也一样     R=0,S=1; Q=1,_Q=0

    把4种可能的结果变成表格,就变成了R-S功能表:如下图:

    这里的禁止只是因为本身设定了Q和_Q是相反的,但是若R,S都等于1的话,则Q和_Q都为0,那就违背了设定,所以R-S触发器要避免两个输入都为1。

    其中最关键的是R=0,S=0时,Q=Q,_Q=_Q,这个意思是输出保持上一次的结果,既不变。

    这个结论其实我们已经在最上面的5副图中论证过了

    不管是从S=1,R=0变成0 0 还是S=0,R=1变成0 0 ,都改变不了输出,因为输出中已经有了一个1,然后这个1会被作为输入,输入到另外一个,会导致另外一个输出还是0(因为有1则0) .既若Q=1,则_Q=0; 若_Q为1,则Q为0.

    若从S=1,R=0 变成 S=0,R=0;本来对应的结果是_Q0,Q1, S对应的是_Q,而R则是Q,关键在于_Q0是因为输入端有两个1,既S为1,Q也是输入为1,那么此时S变成0,Q依然是1,然后Q的1作为_Q的输入,所以保证了_Q还是0,所以结果依然是_Q0,Q1

    因此,00的情况代表记录了上一次的状态。既在00时,若Q=1,_Q=0,那么根据图表,说明上次是S=1,R=0;反过来则说明上次是S=0,R=1。

    R-S触发器能记住哪个输入端为1,但是看起来还是十分的不直观,很绕

     

    2.锁存器:

    能不能有一种电路,有一个数据端,一个保持位

    当保持位为1时,这种情况下数据端的输入就是输出,保持位不影响输出,当保持位为0时,此时电路的输出被记住,数据位的变化影响不了输出,简化如下:

    这个电路和R-S触发器电路相比,应该多一个输入为保持位,如下图:

    这个和上图相比,用两个与门作为输入端,与门的特点是,两个1,才输出1。那么保持位若为1时,则不影响电路的输出,结果和R-S的结果一致,当保持位为0时,则两个输入都变成0,就是R-S触发器功能表中的第三种情况,既不管R-S的输入是多少,都无法改变目前的输出结果。

    保持位的加入,使得电路更好理解了,既保持位为1时,不影响输出,当保持位为0时,状态被记住,无法再更改

     

    这个电路有三个输入,想办法精简成两个,回想下R-S的功能表,当R-S都为1是非法的,当R-S都为0时,则能记住上一次的信息,但是目前我们有了保持位,保持位已经帮我们更好的实现了该功能(也更容易理解)。所以R-S都为0对我们来说也没有意义了,所以我们只剩下R=0,S=1和R=1,S=0这两种情况,而这刚好可以用一个取反器来表示。

    如下图:

    数据端就是R-S,只是有两个分支,流向下面的为S,流向上面的为R,因为有取反器,所以R-S必定是不同的

    很显然此时数据端的输入为0,保持位为0,对应的结果是Q为0,_Q为1.

    此时把数据端设为1,但是由于保持位依然是0,而与门的特点,只要有0,输出就是0,所以数据端不管怎么变,都影响不了输出端。

    当我们把保持位置为1时,那么输入端就能影响输出端了,输出端会跟着数据端的变化而变化

    再把保持位置0,那就保存了刚刚保持位为1时,数据端的状态,既最后一次保持位为1时数据端的输入值。

     

    这种电路被称为电平触发的D型触发器。D代表Data,既数据端,而电平触发就是指当保持位输入某一特定电平(本例为“1”)时,触发器才保存数据端的输入置。 与电平触发对应的,后面我们会讲到“边沿触发”

     

    其实在实际应用中,输入端并不会被叫做保持位,而应该叫时钟Clock, 因为它会在0和1之间有规律的不断的变化。

     通常把数据端记为D,时钟简写为clk,则功能表如下:

    这个电路也叫D型锁存器,他表示电路锁存住一位数据并保持它,以便将来用之。这个电路也可以被称为1位存储器。

     

    似乎不太对啊, 这个电路除了保持位三个字改成了时钟,跟上面的电路一模一样,怎么一会是触发器,一会是锁存器?

    其实触发器其结构均由R-S锁存器派生而来(广义的触发器包括锁存器),R-S锁存器就是上面说的那个:

     触发器更侧重于触发,既当时钟信号来了之后触发某种功能,触发器利用了锁存器的保存原理,但是加上了触发功能,可以控制保存的时间。

     

     

    3.连续加法器:

    有了锁存器,我们再来考虑下如何实现本文开头说的,如何保存1+2的结果

    把锁存器简化一下,就是这样,我们忽略了_Q,那是因为_Q本身就是Q的取反,为了方便理解,所以可有可无。

    如果有8个1位锁存器,把这8个放在一个盒子里,把它们的时钟端连在一起,那么就会变成这样:

    这个锁存器就是8位锁存器,用D0-D7代表8个开关,开关输入8个0或1,时钟信号通常为0,为0时,输出不会改变,当时钟为1时,此时8个输入会被输出到Q0-Q7,然后当时钟为0时,Q0-Q7被保存。

    再简化一下就变成这样:

    就是8位输入,8位输出

     

    下面时8位加法器:

    CI代表进位输入(接地) ,上面两个8位输入A和B,然后把输出8位,和一个进位CO连接到灯泡上。

     

    我们先不考虑减法器,把加法器的输出既连到灯泡,又连到锁存器的输入中,如下图:

    这个图本质上就是一个加法器

    先看最下方的加法器,加法器和我们之前说的一样,有输入A,B和CI,然后输出S到灯泡,还有进位C0,唯一不同的是,输出的8位S,也同时被输出到了最上方,8位锁存器的数据输入端中。

    2-1选择器就理解成一个可以控制输出是A,还是B的选择器,若开关为0,则输出A,若为1则输出B

    整个过程如下:

    起始状态是锁存器的保存开关是1,既时钟为1。选择器的开关为0断开,既选择A端输入

    1.最左边的开关输入8位(00000001=十进制1)到加法器的A端输入,中间的开关输入8位(00000010=十进制2)到选择器的A端输入,此时让选择器的开关断开为0,选择器输出的就是A端的输入,启动加法器,得到一个输出

    2.加法器得到A,B输入后,计算结果得到S1(00000011=十进制3),灯泡显示计算结果,然后同时将S1带到锁存器的输入端

    3.此时锁存器状态为时钟为1,既输出随输入S1改变,那么锁存器的输入S1就被带到了选择器的B端输入,此时断开锁存器的时钟,既时钟信号为0,不再接受数据。选择器的B端输入变成了S1后,此时选择器和锁存器共同保存了第一次计算结果(S1=3).

    4.此时闭合选择器的开关,选择器的输出变成B端输入,既S1被输入到加法器的B端.

    5.然后再改变最左边的开关输入8位(00000011=十进制3),再启动加法器,这时又得到了一个新结果S2(00000110, 3+3=6)

    6.又把S2带到了锁存器的输入端,然后依次循环

     

    这样就通过加法器和锁存器实现了一个能连续运算的加法器!

     

    附上2-1选择器的实现电路:

    有两个与门和一个或门和一个取反器组成,当选择端为0时,B端的与门输出就是0,A端的与门输出就是A,所以结果为A
    同理,当选择器为1时,则B端输出为B,A端输出为0,那么结果为B

    这只是一位选择器,既只能选择1位数据,而上面的连续加法器中,则是8个一位选择器器组成的,将8个选择端连在一起即可。

     

    4.改良连续加法器:

    上面的连续加法器可以处理连续加法,但是不能处理进位,因为仅仅是一个8位加法器,进位则被忽略了,我们可以将8位改成16位或者9位,总之比8位多,即可勉强的解决该问题(因为16位也会存在进位问题,不断连续的加法,最终结果会大于16位),这个问题我们之后再讨论

     

    还可以同过加入清零信号来该改良加法器:

    可以看到上面的是之前的D型锁存器,下面的就仅仅是加了一个清零输入(一个或门)。

    也就是说数据端其中一个输入被清零或门处理后再输出了,而或门就是有1则输出1,所以当清零为1时,则或门输出1,输入到了右上方的或非门中,而或非门则是有1则0,00为1,所以若清零信号为1,那么就可以让Q强制为0.

    其实最简单的清零器就是一个或非门,有1则0

     

    现在再设计一个电路如下图:

    改良后的加法器过程如下:

    1.先清零,关闭清零开关,使锁存器的输出灯泡全部为0,然后同时加法器的B端输入也为0。

    2.在左上开关,输入第一个加数,如(00000001=十进制1 ),此时会得到加法器的输出既S1=1+0=1,因为B端现在是0 

    3.然后关闭锁存器右侧的相加开关(这个相加就是时钟信号,只是在这里代表一个相加的动作,所以叫相加),时钟为1,代表锁存器的输入跟随输出改变,此时S1就被反映到了锁存器的输出Q上,同时也反映到了加法器的B端输入

    4.断开锁存器的相加开关,然后再用左上方的开关输入第二个加数如3,再闭合相加开关,就得到了第二个结果S2=3+1=4.

    5.再断开相加开关,再通过左上开关输入,依次类推

     

    这个改良后的加法器,相比之前那个少了一个选择器,同时可以瞬间清零,更加方便,而且电路原件更少

     

     

     

    5.边沿触发器(edge-tiggered)

    上面我们讨论的都是电平触发器,既当时钟电平为高电平电平时,才能引起输出的改变,但是接下来我们要介绍一种边沿触发器

    这种触发器是在时钟端的输入从0变为1时,才会引起输出的改变,如下:

    这个电路是由两个R-S触发级联而成,左边的是第一级触发器,右边的是第二级触发器

    时钟控制着这两个触发器,对第一级触发器来说时钟会取反

    该电路只有一个数据端,然后第一级触发器的输出同时也是第二级触发器的输入

    回想下触发器的功能,当时钟为1时,触发器的输出会根据数据端而改变,当时钟为0时,则不会改变。

    首先,当时钟为0时,第二级触发器的时钟信号为0,那么此时不管左边第一级数据端如何变化,Q不会改变

    当时钟为1时,第二级触发器时钟为1,此时对第二级触发器来说,输出会随着输入改变,但是输入就是第一级触发器的输出,而对于第一级触发器来说,由于它的时钟信号被取反是0,所以它的结果也不会改变。所以对第二级触发器来说,虽然时钟是1,但是输入端不变,那么输出也是不变的

    因此,不管时钟信号处于某个状态,0,还是1,Q都不会改变

    那么怎么才会改变呢,答案就是时钟从0跳变为1.

    细想一下,当时钟为0时,第二级的结果是被锁住的,然后第一级结果可以任意改变,当此时时钟变为1时,第二级可以动了,而第一级则是被锁住,同时结果被保存下传到第二级上,此时第二级结果发生改变。

    此时再改变数据端。Q也不会变了,因为第一级被锁住了

     

    所以,只有这一个状态能改变Q的结果,只有从0-1才能改变Q的输出。

    这就是边沿触发器的原理!

    我们用一个向上的箭头代表从 0到1 的瞬时变化,那么上面的电路功能表就如下表:

    只有当clk跳变时,Q才改变

    边沿触发器的符号如下图所示:

    clk旁边的小三角代表边沿触发 

     

    6.振荡器(oscillator)

    我们先来看一个电路

     首先这是一个闭合的电路,但是这个状态时不同的,因为左边的开关是断开状态

    我们都知道继电器的特点,当继电器中有电路经过,则继电器产生磁性(电生磁),然后吸引上面的开关(金属簧片)断开,如下图:

     而拉下金属黄片之后,电路又断开了,继电器又失去了磁性,金属簧片又弹回原位。

    弹回原位,电路再次接通,继电器又产生磁性,拉下金属簧片,。。。依次循环

    整个过程就是:接通侧开关,上面的金属簧片开关就会不断的断开,闭合,断开闭合......

    如果我们在金属簧片下接一个锣片,而金属簧片是一个锤子,那么就会变成一个电铃,想象铃铃铃铃的声音。。

     

    将该电路简化如下:

    可以这么看:当开关闭合时,反向器这里的输入为1,那么输出为0,输出为0又导致开关打开

    开关为什么会打开?这是因为这是个抽象,把这个开关想象成上面那个电路图的金属簧片,所以这里我们认为反向器的输出0,会让开关打开...开关打开,输入为0,输出为1,开关又闭合了,如此反复。。。

    我们将电路中的开关去掉,就变成这样了:

    这个图看起来更奇怪,但是我们只要想象下上面那个继电器就明白了,要记住这个电路图就是上面那个继电器电路,而反向器本质上是一个继电器。

    我们把这种电路称为振荡器,振荡器的作用是在不需要人的干预下,不断的输出0和1:

     

     

    我们把振荡器从某个时间的输出开始,经历一段变化又回到同样输出的这一段间隔称为 振荡器的一个循环c y c l e):

    一个循环所需要的时间称为振荡器的周期。假设一个振荡器的周期是0.05秒,则可以在水平轴上标出时间:

    振荡器的频率是周期的倒数。本例中,若振荡器的周期是0.05秒,则其频率是1 除以 0.05 秒=20,即每秒钟2 0个循环。这表明振荡器的输出每秒钟改变 2 0次。

    为了纪念第一个发送和接收无线电波的人—鲁道夫·赫兹( 1 8 5 7-1 8 9 4 ),我们用“赫兹”这个词表示每秒的循环数。这个用法始于2 0世纪2 0年代的德国,后来传到其他国家。

    于是,我们可以说这个振荡器的频率是 2 0赫兹,或直接简写为20Hz.

     

     

    7.计数器

    讲完了振荡器,我们再看看第六段落中说的边沿触发器,我们把边沿触发器的符号记成:

    代表只有时钟从0跳变到1时,Q才发生变化:

     

     

    那么我们把振荡器和边沿触发器相连,然后把_Q的输出连接到数据端D中,如下:

    这个触发器的输出又变成了自己的输入,然后左边振荡器不断的输出0-1,我们分析下该电路:

    幸运的是,我们只需要记住边沿触发器的功能表即可:

    只有时钟从0跳变到1时,Q才发生变化,那么用一张图来表示输出的Q和_Q:

    Clk的状态是从0,瞬间0-1,1,瞬间1-0,1,瞬间0-1,依次类推

    然后D又会再Clk跳变时输出到Q,而_Q也会将此时的Q取反赋给D,也就是说D会随着Clk跳变而不断的变化,但在其余时刻保池不变,而Q也会在Clk跳变时跟着D变化,在其余时刻保持不变

    那么就形成了上面的波形图.

    如果振荡器的频率为20Hz,那么Q的变化频率则是振荡器的一半,就是10Hz.

    由于这个原因,这种电路也被称为分频器(frequency divider)

     

    我们可以把三个边沿触发器和一个振荡器按下面连在一起:

     最左边的clk我们看成一个振荡器,然后右边连接三个边沿触发器,第一个触发器的输出_Q,作为第二个触发器的输入,那么_Q是不是也可以看成一个振荡器,因为_Q也是不断地输出0和1,只是频率为10Hz,最左边的振荡器的一半罢了

    同理,第二个触发器接收到的振荡器频率为10Hz,那么输出的_Q则为5Hz,然后最右边的触发器_Q则为2.5Hz

    这样看其实也可以称之为3个分频器相连,因为我们把每个触发器的输出都当成是振荡器,则和下一个触发器形成了一个分频器。同理,3个触发器的输出Q频率也是递减分别为10Hz,5Hz,2.5Hz

     

    我们把振荡器取反的_Clk和Q1,Q2,Q3的输出  既上面4个顶部信号 变成一个波形图:

    如果我们把把这些信号标上 01:

    如果把这个图形,顺时针旋转90度,那么就变成了:

     

     

    没错,上面的4个顶部信号的输出,连续起来会组成一个计数器,是一个4位计数器,会不断的从0累计到15,然后再变成0,再继续变成15,不断的计数

    如果我们想计更多的数,那么只需要加入更多的触发器,若再加4个触发器,就会变成一个8位计数器:

     

     

    最右边的Q0,就是上面的第一个振荡器的取反输出_Clk,第二个Q1则是第一个触发器的输出...

    如果将Q0-Q7用灯泡连接,那么就可以明显的看到8位数字的显示:


     

    我们把8位输出标记为Q

    每当Clk有0-1的跳变时,Q就会加1,一直加到11111111 =255 为止,然后又变为00000000

     

     

    总结:

    1.我们利用R-S触发器,演化出了1位锁存器,然后变成8位锁存器,通过8位锁存器和加法器,得到了一个改良版的8加法器

    2.利用两级R-S触发器演化出了边沿触发器(只有输入从0跳变1时输出才发生改变),然后通过继电器实现了振荡器,将振荡器和边沿触发器结合,演化出了分频器。

    将7个边沿触发器和一个振荡器连接起来,就可以组成8位计数器

     

    这就是本博客的内容,通过最简单的或非门,与门,或门,取反器,实现了触发器,再通过触发器和振荡器我们实现了计数器!

     

     

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 54,308
精华内容 21,723
关键字:

触发器