为什么要使用触发器
答案:1 悬赏:0 手机版
解决时间 2021-02-17 16:21
- 提问者网友:星軌
- 2021-02-17 09:00
为什么要使用触发器
最佳答案
- 五星知识达人网友:十鸦
- 2021-02-17 09:34
问题一:触发器什么时候使用?有什么功能?举个简单的例子说明一下。 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)
我为什么要使用触发器?比如,这么两个表:
Create Table Student( --学生表
StudentID int primary key, --学号
....
)
Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte Datetime, --归还时间
...
)
用到的功能有:
1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。对于1,创建一个Update触发器:
Create Trigger truStudent
On Student --在Student表中创建触发器
for Update --为什么事件触发
As --事件触发后所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Delete户和Inserted临时表
Where br.StudentID=d.StudentID
end理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。 一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted 虚拟表Deleted在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更......余下全文>>问题二:为什么要设计边沿触发的触发器呢? 触发器分为电平触发和边沿触发两类。
电平触发的触发器原理较简单,学习触发器时,一般先学习电平触发。
电平触发的触发器主要是基本RS触发器
基本RS触发器由电平触发,并且有一个重要的约束条件:/SD和/RD不能同时为零。即:/SD+/RD=1。
许多时候,我们希望触发器只有在时钟来临时,输出状态改变,其它时候,触发器维持,因为这样做可以让多个电路单元的状态同时得以改变,这个时钟,我们称为同步时钟。
同步RS触发器与基本RS触发器的不同之处在于,只有时钟CP=1的时候,输出状态才能被改变。但是,同步触发器也具有一个约束条件,就是当CP=1时,S和R不能同时为1。
此外,同步RS触发器还有一个不足之处在于:当CP=1时,S和R若多次改变,每次改变都会影响输出。这种现象,称为空翻现象。
主从触发器的输出改变仅仅取决于CP的下降沿时刻。有效的解决了空翻问题。但是,主从RS触发器仍然存在约束条件:R、S不能同时为1。
若将主从RS触发器的两个输出分别反馈至输入,即可解除这个约束。这就是JK触发器。
实际应用的触发器,大多是在JK触发器基础上作出简单的变更得到的。问题三:电路为什么要有触发器这种结构 设计触发器时,需要注意触发器的几个时间特性,满足这些特性触发器才能正常工作:
建立时间(T setup time ):是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器。
保持时间(T hold):是指数据稳定后保持的时间,如果保持时间不满足要求那么数据同样也不能被稳定的打入触发器。
数据输出延时(Tco, Clock-to-Output Delay):当时钟有效沿变化后,数据从输入端到输出端的最小时间间隔。问题四:为什么在触发器中不能使用commit When issuing a rollback statement ,if an atomic execution context is active, then an exception condition is raised: invalid transaction termination.
Quoted from SQL99.
对于触发器oracle是支持这个标准的。问题五:大型系统必须得要存储过程和触发器吗 假如你面试的话,面试官肯定不会爱听你说的。如果是一个网络系统,在以下情况下必须使用存储过程:1 涉及大批量数据统计处理你不能把N万记录从服务器通过网络传到客户端去处理,比如客户端是对流量敏感的手机用户,你这么做他们会杀了你,你只能用存储过程,把这些数据在服务器上统计出来,然后把结果传给客户端用户;2 涉及大量用户频繁插入更新删除数据的场合你必须给用户提供专门的存储过程、通过事务处理来完成这类操作,否则,必然会使数据库表的内容发生数据不一致、以及脏读等等问题,此时的存储过程、在这类操作中要小心给表加锁解锁(说白了就是作好事务处理开始、结束和回滚),如果这些事务处理放在客户端,一旦开始事务、但由于网络连接中断,则可能导致数据库无法解锁而停止工作。 3 涉及查询多个服务器上数据的情况,用户完全不可能知道他对面的服务器有多少、各个服务器存储的都是什么数据,此时也可能是做分布式数据库、也可能是仅仅做的多服务器系统(如新闻服务器、广告服务器、各类商品数据的服务器),无论那种情况,你只能编写存储过程、根据用户要求查询这些数据。 等等吧,所以很多应用系统,大多外围程序就是输入输出,真正的功能全都在存储过程里体现。 触发器是个数据同步的程序,比如你修改了表A、你同时期望修改表B,那么就给表A上做触发器吧。简单说就这么些东西。问题六:信用卡问题 信用记录是全国联网的
与国外没有联系
而且现在我国的信用记录也不算十分完善
你可以放心,会耿请到信用卡的问题七:设置一个同步十进制计数器需要几个触发器? 答案是四个,为什么 一个触发器,可实现二个状态;
两个触发器,可实现四个状态;
三个触发器,可实现八个状态;
四个触发器,可实现16个状态;
五个触发器,可实现32个状态;
……。
十进制数:0~9,共十个状态。
一个同步十进制计数器需要几个触发器?
四个~无穷个,都行。问题八:异步fifo中同步为什么要用两级触发器 异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于或者等于当前的写地址,所以此时判断FIFO为空不一定是真空,这样更保守),将读地址同步到写时钟域再和写地址比较进行FIFO满状态判断(同步后的读地址一定是小于或者等于当前的读地址,所以此时判断FIFO为满不一定是真空,这样更保守),这样可以保证FIFO的特性:FIFO空之后不能继续读取,FIFO满之后不能继续写入。
大多数情形下,异步FIFO两端的时钟不是同频的,或者读快写慢,或者读慢写快,这时候进行地址同步的时候,可能会有地址遗漏,以读慢写快为例,进行满标志判断的时候需要将读地址同步到写时钟域,因为读慢写快,所以不会有读地址遗漏,同步后的读地址滞后当前读地址,所以可能满标志会提前产生。进行空标志判断的时候需要将写地址同步到读地址,因为读慢写快,所以当读时钟同步写地址的时候,必然会漏掉一部分写地址(写时钟快,写地址随写时钟翻转,直到满标志出现为止),那到底读时钟会同步到哪个写地址?不必在意是哪一个,我们关注的是漏掉的地址会不会对FIFO的空标志产生影响。比如写地址从0写到10,期间读时钟域只同步到了2,5,7这三个写地址,漏掉了其他地址。同步到7地址时,真实的写地址可能已经写到10地址,相当于“在读时钟域还没来得及觉察的情况下,写时钟域可能偷偷写了数据到FIFO去”,这样在比较读写地址的时候不会产生FIFO“空”读操作。漏掉的地址也没有对FIFO的逻辑操作产生影响。
我们可以对异步FIFO的地址采用binary编码,这样并不影响异步FIFO的功能,前提是读写地址同步时能够保持正确。这种情况在功能仿真时完全正确,问题只有到时序仿真时才会遇到。毛刺可以说是异步电路的杀手,一个毛刺被触发器采样后会被放大,然后传播,导致电路功能出错。binary编码的地址总线在跳变时极易产生毛刺,因为binary编码是多位跳变,在实现电路时不可能做到所有的地址总线等长,address bus skew必然存在,而且写地址和读地址分属不同时钟域,读写时钟完全异步,这样地址总线在进行同步过程中出错不可避免,比如写地址在从0111到1000转换时4条地址线同时跳变,这样读时钟在进行写地址同步后得到的写地址可能是0000-1111的某个值,这个完全不能确定,所以用这个同步后的写地址进行FIFO空判断的时候难免出错。
这个时候gray码体现了价值,一次只有一位数据发生变化,这样在进行地址同步的时候,只有两种情况:1.地址同步正确;2.地址同步出错,但是只有1位出错;第一种正确的情况不需要分析,我们关注第二种,假设写地址从000->001,读时钟域同步出错,写地址为000->000,也就是地址没有跳变,但是用这个错误的写地址去做空判断不会出错,最多是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形。所以gray码保证的是同步后的读写地址即使在出错的情形下依然能够保证FIFO功能的正确性,当然同步后的读写地址出错总是存在的(因为时钟异步,采样点不确定)。这里需要注意gray码只是在相邻两次跳变之间才会出现只有1位数据不一致的情形,超过两个周期则不一定,所有地址总线bus skew一定不能超过一个周期,否则可能出现gray码多位数据跳变的情况,这个时候gray码就失去了作用,因为这时候同步后的地址已经不能保证只有1位跳变了。
......余下全文>>问题九:触发器的sql语句为什么要用游标 不一定要用游标的。游标只是用来批量存储一些值。比如说你需要把某一张或者几张表的数据遍历憨边。才会用到游标。只是单纯的逻辑判断及处理的话,就不需要了。
如果你有其他更详细的问题的话,可以继续问。上面的问题太宽泛了。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)
我为什么要使用触发器?比如,这么两个表:
Create Table Student( --学生表
StudentID int primary key, --学号
....
)
Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte Datetime, --归还时间
...
)
用到的功能有:
1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。对于1,创建一个Update触发器:
Create Trigger truStudent
On Student --在Student表中创建触发器
for Update --为什么事件触发
As --事件触发后所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Delete户和Inserted临时表
Where br.StudentID=d.StudentID
end理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。 一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted 虚拟表Deleted在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更......余下全文>>问题二:为什么要设计边沿触发的触发器呢? 触发器分为电平触发和边沿触发两类。
电平触发的触发器原理较简单,学习触发器时,一般先学习电平触发。
电平触发的触发器主要是基本RS触发器
基本RS触发器由电平触发,并且有一个重要的约束条件:/SD和/RD不能同时为零。即:/SD+/RD=1。
许多时候,我们希望触发器只有在时钟来临时,输出状态改变,其它时候,触发器维持,因为这样做可以让多个电路单元的状态同时得以改变,这个时钟,我们称为同步时钟。
同步RS触发器与基本RS触发器的不同之处在于,只有时钟CP=1的时候,输出状态才能被改变。但是,同步触发器也具有一个约束条件,就是当CP=1时,S和R不能同时为1。
此外,同步RS触发器还有一个不足之处在于:当CP=1时,S和R若多次改变,每次改变都会影响输出。这种现象,称为空翻现象。
主从触发器的输出改变仅仅取决于CP的下降沿时刻。有效的解决了空翻问题。但是,主从RS触发器仍然存在约束条件:R、S不能同时为1。
若将主从RS触发器的两个输出分别反馈至输入,即可解除这个约束。这就是JK触发器。
实际应用的触发器,大多是在JK触发器基础上作出简单的变更得到的。问题三:电路为什么要有触发器这种结构 设计触发器时,需要注意触发器的几个时间特性,满足这些特性触发器才能正常工作:
建立时间(T setup time ):是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器。
保持时间(T hold):是指数据稳定后保持的时间,如果保持时间不满足要求那么数据同样也不能被稳定的打入触发器。
数据输出延时(Tco, Clock-to-Output Delay):当时钟有效沿变化后,数据从输入端到输出端的最小时间间隔。问题四:为什么在触发器中不能使用commit When issuing a rollback statement ,if an atomic execution context is active, then an exception condition is raised: invalid transaction termination.
Quoted from SQL99.
对于触发器oracle是支持这个标准的。问题五:大型系统必须得要存储过程和触发器吗 假如你面试的话,面试官肯定不会爱听你说的。如果是一个网络系统,在以下情况下必须使用存储过程:1 涉及大批量数据统计处理你不能把N万记录从服务器通过网络传到客户端去处理,比如客户端是对流量敏感的手机用户,你这么做他们会杀了你,你只能用存储过程,把这些数据在服务器上统计出来,然后把结果传给客户端用户;2 涉及大量用户频繁插入更新删除数据的场合你必须给用户提供专门的存储过程、通过事务处理来完成这类操作,否则,必然会使数据库表的内容发生数据不一致、以及脏读等等问题,此时的存储过程、在这类操作中要小心给表加锁解锁(说白了就是作好事务处理开始、结束和回滚),如果这些事务处理放在客户端,一旦开始事务、但由于网络连接中断,则可能导致数据库无法解锁而停止工作。 3 涉及查询多个服务器上数据的情况,用户完全不可能知道他对面的服务器有多少、各个服务器存储的都是什么数据,此时也可能是做分布式数据库、也可能是仅仅做的多服务器系统(如新闻服务器、广告服务器、各类商品数据的服务器),无论那种情况,你只能编写存储过程、根据用户要求查询这些数据。 等等吧,所以很多应用系统,大多外围程序就是输入输出,真正的功能全都在存储过程里体现。 触发器是个数据同步的程序,比如你修改了表A、你同时期望修改表B,那么就给表A上做触发器吧。简单说就这么些东西。问题六:信用卡问题 信用记录是全国联网的
与国外没有联系
而且现在我国的信用记录也不算十分完善
你可以放心,会耿请到信用卡的问题七:设置一个同步十进制计数器需要几个触发器? 答案是四个,为什么 一个触发器,可实现二个状态;
两个触发器,可实现四个状态;
三个触发器,可实现八个状态;
四个触发器,可实现16个状态;
五个触发器,可实现32个状态;
……。
十进制数:0~9,共十个状态。
一个同步十进制计数器需要几个触发器?
四个~无穷个,都行。问题八:异步fifo中同步为什么要用两级触发器 异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于或者等于当前的写地址,所以此时判断FIFO为空不一定是真空,这样更保守),将读地址同步到写时钟域再和写地址比较进行FIFO满状态判断(同步后的读地址一定是小于或者等于当前的读地址,所以此时判断FIFO为满不一定是真空,这样更保守),这样可以保证FIFO的特性:FIFO空之后不能继续读取,FIFO满之后不能继续写入。
大多数情形下,异步FIFO两端的时钟不是同频的,或者读快写慢,或者读慢写快,这时候进行地址同步的时候,可能会有地址遗漏,以读慢写快为例,进行满标志判断的时候需要将读地址同步到写时钟域,因为读慢写快,所以不会有读地址遗漏,同步后的读地址滞后当前读地址,所以可能满标志会提前产生。进行空标志判断的时候需要将写地址同步到读地址,因为读慢写快,所以当读时钟同步写地址的时候,必然会漏掉一部分写地址(写时钟快,写地址随写时钟翻转,直到满标志出现为止),那到底读时钟会同步到哪个写地址?不必在意是哪一个,我们关注的是漏掉的地址会不会对FIFO的空标志产生影响。比如写地址从0写到10,期间读时钟域只同步到了2,5,7这三个写地址,漏掉了其他地址。同步到7地址时,真实的写地址可能已经写到10地址,相当于“在读时钟域还没来得及觉察的情况下,写时钟域可能偷偷写了数据到FIFO去”,这样在比较读写地址的时候不会产生FIFO“空”读操作。漏掉的地址也没有对FIFO的逻辑操作产生影响。
我们可以对异步FIFO的地址采用binary编码,这样并不影响异步FIFO的功能,前提是读写地址同步时能够保持正确。这种情况在功能仿真时完全正确,问题只有到时序仿真时才会遇到。毛刺可以说是异步电路的杀手,一个毛刺被触发器采样后会被放大,然后传播,导致电路功能出错。binary编码的地址总线在跳变时极易产生毛刺,因为binary编码是多位跳变,在实现电路时不可能做到所有的地址总线等长,address bus skew必然存在,而且写地址和读地址分属不同时钟域,读写时钟完全异步,这样地址总线在进行同步过程中出错不可避免,比如写地址在从0111到1000转换时4条地址线同时跳变,这样读时钟在进行写地址同步后得到的写地址可能是0000-1111的某个值,这个完全不能确定,所以用这个同步后的写地址进行FIFO空判断的时候难免出错。
这个时候gray码体现了价值,一次只有一位数据发生变化,这样在进行地址同步的时候,只有两种情况:1.地址同步正确;2.地址同步出错,但是只有1位出错;第一种正确的情况不需要分析,我们关注第二种,假设写地址从000->001,读时钟域同步出错,写地址为000->000,也就是地址没有跳变,但是用这个错误的写地址去做空判断不会出错,最多是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形。所以gray码保证的是同步后的读写地址即使在出错的情形下依然能够保证FIFO功能的正确性,当然同步后的读写地址出错总是存在的(因为时钟异步,采样点不确定)。这里需要注意gray码只是在相邻两次跳变之间才会出现只有1位数据不一致的情形,超过两个周期则不一定,所有地址总线bus skew一定不能超过一个周期,否则可能出现gray码多位数据跳变的情况,这个时候gray码就失去了作用,因为这时候同步后的地址已经不能保证只有1位跳变了。
......余下全文>>问题九:触发器的sql语句为什么要用游标 不一定要用游标的。游标只是用来批量存储一些值。比如说你需要把某一张或者几张表的数据遍历憨边。才会用到游标。只是单纯的逻辑判断及处理的话,就不需要了。
如果你有其他更详细的问题的话,可以继续问。上面的问题太宽泛了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯