sql中的触发器

本文结合某位大神写的  <数据库触发器的分类与区别>所写,有些例子等,均摘至此文!!!

一.触发器是什么

                 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行,查询是没有触发器的。触发器经常用于加强数据的完整性约束和业务规则等。 当然我们要知道存储过程是没有返回值(return)的,而触发器是有(return)的,

二.触发器能干什么

       触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。这是百度百科的答案,看到不懂,那我觉得触发器就像javaScript中的事件,点击事件也好,鼠标移入移出事件也罢,也就是说不需要我们手动的去启动它,只是将事件设好,当他根据某一行为执行这些事件的开始(这儿也就是触发器),有了触发器我们完全可以在执行第一条sql语句的时候,触发也去执行第二条语句(当然这儿涉及到了触发器的分类)

三,触发器的分类   

DDL触发器

       它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。

 DML触发器

         当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。      

例:建立一个触发器,当职工表执行删除一条记录的时候,把被删除的记录添加删除日志表里

 替代触发器

INSTEAD OF 触发器又称为替代触发器,用于执行一个替代操作来代替触发事件的操
作。例如:针对 INSERT事件的 INSTEAD OF 触发器,它由 INSERT语句触发,当出现 INSERT
语句时,该语句不会被执行,而是执行 INSTEAD OF 触发器中定义的语句。
创建 INSTEAD OF 触发器需要注意以下几点:
                 只能被创建在视图上,并且该视图没有指定 WITH CHECK OPTION 选项。
                 不能指定 BEFORE 或 AFTER 选项。  FOR EACH ROW 子可是可选的,即                                  INSTEAD OF 触发器只能在行级上触发、或只能是行级触发器,没有必要指定。
                 没有必要在针对一个表的视图上创建 INSTEAD OF 触发器,只要创建 DML 触发器就                  可以了。

系统事件触发器:                           

            登录触发器:

                          例: 创建登陆,退出触发器

四,触发器的究极作用

          可在写入数据表前,强制检验或转换数据。

          触发器发生错误时,异动的结果会被撤销。

           部份数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

            可依照特定的情况,替换异动的指令 (INSTEAD OF)。

五.触发器的应用

       1.确保数据库的安全性

可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
可以基于数据库中的数据限制用户的操作,例如不允许价格的升幅一次超过 10%。

       2.实施复杂的安全性授权

利用触发器控制实体的安全性,可以将权限藉于各种数据库的值。

       3.提供复杂的审计功能

审计用户操作数据库的语句。
把用户对数据库的更新写入审计表。

       4.维护不同数据库之间同步表

在不同的数据库之间可以利用快照来实现数据的复制,但有些系统要求两个数据库数据
实时同步,就必须利用触发器从一个数据库中向另一个数据库复制数据。

        5.实现复杂的数据完整性规则

实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不
同,触发器可以引用列或数据库对象。
提供可变的缺省值。

        6.实现复杂的非标准的数据库相关完整性规则

触发器可以对数据库中相关的表进行连环更新。例如,在 auths 表 author_code 列上的
删除触发器可导致相应删除在其它表中的与之匹配的行。
 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当
插入一个与其主健不匹配的外部键时,这种触发器会起作用。

六.触发器的组成

 触发器是由

触发事件(如增删改查).

触发时间(即增删改查发生之前还是之后).

触发操作(该TRIGGER 被触发之后的目的和意图),

触发对象(包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。).

触发条件(由 WHEN 子句指定一个逻辑表达式。只有当该表达式的值为 TRUE 时,遇到触发事件才会自动执行触发器,使其执行触发操作。).

触发频率(说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发
器和行级(ROW)触发器。)

七.触发器的触发次序

  1. 执行 BEFORE 语句级触发器;

2对与受语句影响的每一行
   2.1  执行 BEFORE 行级触发器
   2.2 执行 DML 语句
   2.3 执行 AFTER 行级触发器
3. 执行 AFTER 语句级触发器

八.触发器的优点

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

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

九.编写触发器的注意事项

首先触发器是不接受参数的,

其次一个表上最多是可以有12个触发器的,但是同一时间,同一事件,同一类型的触发器只能有一个,并且触发器之间不能有矛盾,

当然一个表中的触发器越多,对该表的DML操作的性能影响就越大,触发器最大为32kb,

若是确是需要,可以先建立过程,然后在触发器中用call语句进行调用,

在触发的执行部分只能用DML语句,不能使用DDL语句

触发器中不能包含事务控制语句,因为触发器是触发语句中的一部分,触发语句被提交,回滚时触发器也被提交或是回滚了,

在触发器主体中调用的任何过程,函数,都不能使用事务控制语句.

在触发器主体中不能申明任何 long的 blob变量,新值new 和旧值oid也不能向表中的任何long和blob列

不同类型的触发器的语法 格式和作用有较大区别

触发器声明变量附值方式的dephi类似,使用:=符号来赋值,新值new,旧值old前面不要忘记:引号符号.

猜你喜欢

转载自blog.csdn.net/program_blackcat/article/details/53434136