数据库触发器相关(以mysql为例)
2017-02-24 13:47
246 查看
一.触发器概述
触发器是一个被置顶关联到一个表的数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器简而言之就是在特定事件发生时会被触发从而达到管理者想要的效果。
例如:
每当客户订购一个产品时,都从产品库存量中减去订购的数量。
无论何时删除一行,都会在数据库的存档表中保留一个副本。
二.创建触发器
语法格式:
CREATE TRIGGER name time event
ON tb_name FOR EACH ROW body
语法说明如下:
name:触发器的名称,触发器在当前数据库必须有唯一的名称, 如果要在某个特定数据库中创建, 名称前应加上数据库的名称
time 触发器被触发的时刻有BEFORE和AFTER两个选项。用于表示触发器是在激活它的语句之前或者之后触发
如果希望验证新数据是否满足使用的限制, 则通常使用BEFORE触发
如果希望在触发之后完成几个乃至更多的改变,则通常使用AFTER触发
event 触发事件, 用于指定激活触发器的语句的种类。 目前MYSQL触发种类只有INSERT, UPDATE, DELETE三种。
tb_name 与触发器相关联的表名,必须引用永久性表,不能将触发器与临时表或视图关联起来
FOR EACH ROW 这个声明用来指定对于受触发事件影响的每一行都要激活触发器的动作。如使用INSERT向表中插入多条记录时,触发器对于每一行记录都会触发执行
body 触发器动作主体,包含触发器激活时要执行的MYSQL语句。
举例:如图所示在takes表上定义一个UPDATE触发器,当takes表中元组的属性grade被更新时,意味着学生上的这么课的课程成绩被更新,需要用触发器维护student里元组的tot_cred属性,使其获得的总学分保持实时更新。只有当属性grade从空值或者’F’被更新为代表课程已经完成的具体分数时,触发器才会被激发。
delimiter
create trigger credit_get after update
on takes for each row
begin
if (NEW.grade <> 'F' and NEW.grade is not null
and (OLD.grade = 'F' or OLD.grade is null))
then
update student
set tot_cred = tot_cred +
(select credits
from course
where course.course_id = NEW.course_id)
where student.ID = NEW.ID;
end if;
end;三.查看触发器
如需在数据库中查看已存在的触发器,可以使用如下语句
SHOW TRIGGERS [FROM|IN database.name]
四.删除触发器
DROP TRIGGER [IF EXISTS] [database.name] trigger_name
五. 关于触发器的进一步说明
与其他DBMS相比,目前MYSQL版本所支持的触发器还比较低级,未来肯定会有所改进
创建触发器可能需要特殊的安全访问权限,但是触发器的执行是自动的,也就是说如果INSERT, DELETE, 或UPDATE可以执行,那么触发器也可正常工作
应该多用触发器来保证数据的一致性,完整性和正确性。
触发器有一种十分有意义的使用模式——创建审计跟踪,即可以使用触发器将表的更改状态以及之前和之后的状态记录到另外一张数据表中。
触发器是一个被置顶关联到一个表的数据库对象,当对一个表的特定事件出现时,它将会被激活。触发器简而言之就是在特定事件发生时会被触发从而达到管理者想要的效果。
例如:
每当客户订购一个产品时,都从产品库存量中减去订购的数量。
无论何时删除一行,都会在数据库的存档表中保留一个副本。
二.创建触发器
语法格式:
CREATE TRIGGER name time event
ON tb_name FOR EACH ROW body
语法说明如下:
name:触发器的名称,触发器在当前数据库必须有唯一的名称, 如果要在某个特定数据库中创建, 名称前应加上数据库的名称
time 触发器被触发的时刻有BEFORE和AFTER两个选项。用于表示触发器是在激活它的语句之前或者之后触发
如果希望验证新数据是否满足使用的限制, 则通常使用BEFORE触发
如果希望在触发之后完成几个乃至更多的改变,则通常使用AFTER触发
event 触发事件, 用于指定激活触发器的语句的种类。 目前MYSQL触发种类只有INSERT, UPDATE, DELETE三种。
tb_name 与触发器相关联的表名,必须引用永久性表,不能将触发器与临时表或视图关联起来
FOR EACH ROW 这个声明用来指定对于受触发事件影响的每一行都要激活触发器的动作。如使用INSERT向表中插入多条记录时,触发器对于每一行记录都会触发执行
body 触发器动作主体,包含触发器激活时要执行的MYSQL语句。
举例:如图所示在takes表上定义一个UPDATE触发器,当takes表中元组的属性grade被更新时,意味着学生上的这么课的课程成绩被更新,需要用触发器维护student里元组的tot_cred属性,使其获得的总学分保持实时更新。只有当属性grade从空值或者’F’被更新为代表课程已经完成的具体分数时,触发器才会被激发。
delimiter
create trigger credit_get after update
on takes for each row
begin
if (NEW.grade <> 'F' and NEW.grade is not null
and (OLD.grade = 'F' or OLD.grade is null))
then
update student
set tot_cred = tot_cred +
(select credits
from course
where course.course_id = NEW.course_id)
where student.ID = NEW.ID;
end if;
end;三.查看触发器
如需在数据库中查看已存在的触发器,可以使用如下语句
SHOW TRIGGERS [FROM|IN database.name]
四.删除触发器
DROP TRIGGER [IF EXISTS] [database.name] trigger_name
五. 关于触发器的进一步说明
与其他DBMS相比,目前MYSQL版本所支持的触发器还比较低级,未来肯定会有所改进
创建触发器可能需要特殊的安全访问权限,但是触发器的执行是自动的,也就是说如果INSERT, DELETE, 或UPDATE可以执行,那么触发器也可正常工作
应该多用触发器来保证数据的一致性,完整性和正确性。
触发器有一种十分有意义的使用模式——创建审计跟踪,即可以使用触发器将表的更改状态以及之前和之后的状态记录到另外一张数据表中。
相关文章推荐
- 数据库 字段利用数据库触发器填写 相关知识点
- JPA相关--配置Myeclipse的提示和MySql的默认数据库引擎
- mysql的定时任务和触发器相关
- 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念
- 数据库-mysql基础相关
- MySQL优化全攻略-相关数据库命令
- JSP连接Mysql的数据库连接池配置相关
- 数据库之mysql存储过程 触发器
- MYSQL 数据库相关操作总结
- MySQL 数据库相关
- MySQL存储过程和触发器的实现--数据库学习笔记
- mysql的定时任务和触发器相关
- MySQL服务器学习笔记!(一) ——数据库相关概念
- mysql的数据库相关维护操作:重启、修改连接数、删除连接
- MySQL添加触发器相关操作
- JSP连接Mysql的数据库连接池配置相关
- MySQL中新建用户,新建数据库,用户授权,删除用户,修改密码的相关操作
- 巴途_数据库存储引擎学习之《mysql,innoDB,MyISAM等相关数据库存储引擎分析》
- MySQL服务器学习笔记!(一) ——数据库相关概念
- 6.(Mysql数据管理相关)连接MYSQL,修改密码,增加新用户,数据库相关命令,表操作相关命令,数据相关命令,数据库sql导入和导出,备份数据库,查看不到mysql数据库的解决办法