触发器分为两种,一种与数据表绑定,响应数据表指定动作(insert、delete或update),此处称为表级;一种与数据库本身绑定,响应数据定义语句(主要是CREATE、ALTER 和 DROP 开头的语句),此处称为库级。本篇以下所说触发器皆指表级触发器。

触发器是一段有特定语法,实现一定功能的SQL语句,它与数据表绑定,当数据表发生指定动作(insert、delete或update)时,由数据库自动调用。一个触发器必须且只能绑定一张数据表,必须且只能绑定数据表的一个动作(insert、delete或update)。触发器可以分为两种,一种是动作之后(After),一种是替代执行(instead of)。两种触发器可以同时绑定数据表的同一个动作(insert、delete或update)。但动作之后(After)触发器可以同时绑定多个,而替代执行(instead of)触发器一个数据表只能绑定三个,即一个动作(insert、delete或update)只能绑定一个。

触发器耗费性能,不易调试,不利于迁移,不符合时兴的面向对象设计理念,也不容易被接手老项目的人注意到,因而应尽量避免使用。

触发器语法:

创建:
CREATE TRIGGER trigger_name --触发器的名字
ON {table_name | view_name} --与触发器绑定的表或视图,必须且只能与一个表或视图绑定
{FOR | After | Instead of } --触发器类型,动作之后(After)或替代执行(instead of)
[ insert, update,delete ] --触发器响应的具体动作,一个触发器只能响应一个动作
AS
sql_statement --你需要编写的SQL语句
删除:
DROP TRIGGER { trigger/*要删除的触发器名字*/ } [ ,...n ]
修改:
ALTER TRIGGER trigger_name --触发器的名字
ON table_name --与触发器绑定的表或视图,必须且只能与一个表或视图绑定
{FOR | After | Instead of } --触发器类型,动作之后(After)或替代执行(instead of)
{[DELETE][,][INSERT][,][UPDATE]}--触发器响应具体动作,一个触发器只能响应一个动作 AS
sql_statement; --你需要编写的SQL语句
禁用启用触发器:
  禁用:alter table 表名 disable trigger 触发器名称
  启用:alter table 表名 enable trigger 触发器名称

触发器执行后会自动创建两张虚表inserted与deleted。它们可以理解为系统自动创建的、在触发器中使用的临时表,触发器开始时创建,结束后删除。它们的结构与触发器绑定的表结构一致,并且是只读的。

动作

Inserted

Deleted

增加(insert)

存放增加的记录

删除(delete)

存放被删除的记录

修改(update)

存放更新后的记录

存放更新前的记录

当数据表只存在动作之后(After)触发器时,动作(insert、delete或update)对数据表进行真实更改,而存在替代执行(instead of)触发器时,动作(insert、delete或update)不对数据表进行真实更改。替代执行(instead of)触发器执行时间先于动作之后(After)触发器。有多个动作之后(After)触发器时,执行顺序取决于触发器建立时间,先建立的先执行。

触发器中不能使用以下语句:

CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
DISK 语句,如:DISK INIT、DISK RESIZE。
LOAD 语句,如:LOAD DATABASE、LOAD LOG。
RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。

=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

最新文章

  1. 从HTML原型到jsp页面完美转型攻略(教你即使不会写代码也能弄出漂亮的网页)
  2. python数据结构与算法——二叉树结构与遍历方法
  3. Mac直播服务器Nginx配置对HLS的支持
  4. 怎样开发单页面app
  5. 为该目录以及子目录添加index.html
  6. Android中使用Parcelable
  7. POJ 2446 Chessboard (二分图最大匹配)
  8. cocos2d-x 2.1.4学习笔记之HelloWorld分析
  9. LFS,编译自己的Linux系统 - 完成准备工作
  10. MEMS微加工技术
  11. jquery submit()不能提交表单的解决方法
  12. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
  13. 64bit Centos6.4编hadoop-2.5.1
  14. swift -- 构造/析构函数
  15. 201521123005 《Java程序设计》 第十周学习总结
  16. iframe及与页面之间的通信
  17. 杭电ACM2003--求绝对值
  18. Nginx实现负载均衡的简单案例
  19. 一文了解Python中的判断语句
  20. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

热门文章

  1. MFC 控件编程之水平滚动条跟垂直滚动条
  2. ZooKeeper 初体验
  3. 第1章 ssh命令和SSH服务详解
  4. Perl回调函数和闭包
  5. shell编程基础(六): 透彻解析查找命令find
  6. HBase命令终端测试
  7. [转]PHP开发者必须了解的工具—Composer
  8. 分页Sql语句
  9. 33.QT-UTF8,GBK互转
  10. Spring Boot Docker 实战