文档章节

sql中的触发器

Black_Cat_
 Black_Cat_
发布于 2016/07/09 14:25
字数 2441
阅读 79
收藏 0

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

一.触发器是什么

                 触发器(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前面不要忘记:引号符号.

© 著作权归作者所有

Black_Cat_
粉丝 3
博文 10
码字总数 5698
作品 0
海淀
程序员
私信 提问
不同类型的 SQL Server 触发器

简介 触发器是数据库对象。基本上当一个和触发器相关的数据定义语言或者数据操纵语言命令语句被执行时,这些特别类型的存储过程就会自动执行。触发器被用在数据定义语言和数据操纵语言命令语...

oschina
2013/07/21
1K
0
探索SQL Server元数据(二)

背景   上一篇中,我介绍了SQL Server 允许访问数据库的元数据,为什么有元数据,如何使用元数据。这一篇中我会介绍如何进一步找到各种有价值的信息。以触发器为例,因为它们往往一起很多问...

DB乐之者
2018/07/17
0
0
【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

《ORACLE PL/SQL编程详解》 系列文章目录导航 ——通过知识共享树立个人品牌。 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在、经典”的写ORACLE PL/SQL编程...

yonghu86
2012/07/30
0
0
获取有关 DML 触发器的信息

在 SQL Server 2005 中,您可以确定一个表中触发器的类型、名称、所有者以及创建日期。 还可以执行以下操作: 获取触发器定义的有关信息,前提是触发器未在创建或修改时加密。可能需要了解触...

fanr_zh
2011/05/27
0
0
数据库优化之创建存储过程、触发器

存储过程可加快查询的执行速度,提高访问数据的速度,帮助实现模块化编程,保存一致性,提高安全性。触发器是在对表进行插入、更新、删除操作时自动执行的存储过程,通常用于强制业务规则。 ...

杨书凡
2017/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
25分钟前
6
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
28分钟前
4
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
29分钟前
5
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
53分钟前
6
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
54分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部