下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据库中的触发器,你知道多少?

作者:课课家教育the     来源: http://www.kokojia.com点击数:1637发布时间: 2017-05-27 11:00:31

标签: 数据库触发器SQLServer

  触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。一般的存储过程是通过存储过程名直接调用,而触发器主要是通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。看到这里,不难看出,小编在这里就是要对触发器进行讲解!

  什么是触发器?

  触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQLServer2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

  触发器优点

  触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与CHECK约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE或DELETE)允许采取多个不同的对策以响应同一个修改语句。

  DML触发器分为:

  1、after触发器(之后触发)

  a、insert触发器

  b、update触发器

  c、delete触发器

  触发器语法:

数据库中的触发器,你知道多少?_数据库_触发器_SQLServer_课课家教育

  insteadof触发器(之前触发)

  其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而insteadof触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义insteadof触发器,也可以在视图上定义。

  触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

 2、insteadof触发器(之前触发)    其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而insteadof触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义insteadof触发器,也可以在视图上定义。    触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

      Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。

  创建触发器

  语法

Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。    触发器实现原理图    创建触发器    语法

  #创建insert类型触发器

#创建insert类型触发器

  insert触发器,会在inserted表中添加一条刚插入的记录。

  #创建delete类型触发器

#创建delete类型触发器

  delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。

  #创建update类型触发器

delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。    #创建update类型触发器

  update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。

  触发器示例

  Example1

  --禁止用户插入数据(实际上是先插入,然后立刻将其删除!)

  createtriggertr_insertonbank

  for--for表示执行之后的操作

  insert--即先执行了插入操作,同时在临时表中保存了插入记录

  as

  --执行完插入之后,在新生成的表中将刚刚插入的那条记录删除,

  --而此时得到的刚刚插入的记录的id是通过临时表inserted得到的

  delete*frombankwherecid=(selectcidfrominserted)

  生成上面的触发器后,当用户再输入insert语句后就见不到效果了!

  如:insertintobankvalues('0004',10000),是插入不进数据库的。

  Example2

  --删除谁就让谁的账户加上10元

  createtriggertr_daleteonbank

  insteadof

  delete

  as

  updatebankbalance=balance+10wherecid=(selectcidfromdeleted)

  生成这个触发器之后,当用户输入delete语句后,对应的那个id不但没有被删除掉,而且他的账户增加了10元

  如:deletefrombankwherecid='0002',执行完这句话后,编号为0002的账户会增加10元

  小编结语:

  触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作……同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

  更多内容尽在课课家教育~~

赞(25)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程