触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
数据库触发器有下面的作用:
1.安全性。能够基于数据库的值使用户具有操作数据库的某种权利。
# 能够基于时间限制用户的操作,比如不同意下班后和节假日改动数据库数据。
# 能够基于数据库中的数据限制用户的操作,比如不同意股票的价格的升幅一次超过10%。
2.审计。能够跟踪用户对数据库的操作。
# 审计用户操作数据库的语句。
# 把用户对数据库的更新写入审计表。
3.实现复杂的数据完整性规则
# 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器能够引用列或数据库对象。比如,触发器可回退不论什么企图吃进超过自己保证金的期货。
# 提供可变的缺省值。
4.实现复杂的非标准的数据库相关完整性规则。触发器能够对数据库中相关的表进行连环更新。比如,在auths表author_code列上的删除触发器可导致对应删除在其他表中的与之匹配的行。
# 在改动或删除时级联改动或删除其他表中的与之匹配的行。
# 在改动或删除时把其他表中的与之匹配的行设成NULL值。
# 在改动或删除时把其他表中的与之匹配的行级联设成缺省值。
# 触发器可以拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这样的触发器会起作用。比如,可以在books.author_code 列上生成一个插入触发器,假设新值与auths.author_code列中的某值不匹配时,插入被回退。
5.同步实时地复制表中的数据。
6.自己主动计算数据值,假设数据的值达到了一定的要求,则进行特定的处理。比如,假设公司的帐号上的资金低于5万元则马上给財务人员发送警告数据。
mysql创建触发器
1、老版本mysql语法:
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
2、新版本mysql语法:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
注意:或许你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。
mysql5.7新版本语法发生了一些小小的变化,同时也可以自定义用户,语法相对来说简单了很多,原理和老版本还是一样的;
准备工作:
1、创建表tab1
sql命令:
DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(
tab1_id varchar(11)
);
2、创建表tab2
sql命令:
DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(
tab2_id varchar(11)
);
实例1:
1、创建触发器:t_afterinsert_on_tab1
作用:增加tab1表记录后自动将记录增加到tab2表中
老版本sql命令:
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
CREATE TRIGGER t_afterinsert_on_tab1
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
insert into tab2(tab2_id) values(new.tab1_id);
END;
新版本sql命令:
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
CREATE
TRIGGER t_afterinsert_on_tab1
AFTER INSERT
ON tab1 FOR EACH ROW
insert into tab2(tab2_id) values(new.tab1_id);
2、向tab1表插入一条数据做测试;
sql命令:
INSERT INTO tab1(tab1_id) values('0001');
3、查看tab1表和tab2表的结果;
sql命令:
SELECT * FROM tab1;
SELECT * FROM tab2;
实例2:
1、创建触发器:t_afterdelete_on_tab1
作用:删除tab1表记录后自动将tab2表中对应的记录删去
老版本sql命令:
DROP TRIGGER IF EXISTS t_afterdelete_on_tab1;
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
delete from tab2 where tab2_id=old.tab1_id;
END;
新版本sql命令:
DROP TRIGGER IF EXISTS t_afterdelete_on_tab1;
CREATE
TRIGGER t_afterdelete_on_tab1
AFTER DELETE
ON tab1 FOR EACH ROW
delete from tab2 where tab2_id=old.tab1_id;
2、删除tab1表一条数据
sql命令:
`DELETE FROM tab1 WHERE tab1_id='0001';`
3、查看tab1表和tab2表的结果
sql命令:
SELECT * FROM tab1;
SELECT * FROM tab2;
三、mysql查看触发器
和查看数据库(show databases;)查看表格(show tables;)一样,查看触发器的语法如下:
`SHOW TRIGGERS [FROM schema_name];`
其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就不必先“USE database_name;”了。
实例:
1、查看tab1表下面所有的触发器:
sql命令:
`SHOW TRIGGERS`
2、查看test数据库下面的触发器,tabl表属于test数据库:
sql命令:
`SHOW TRIGGERS FROM test`
四、mysql删除触发器
和删除数据库、删除表格一样,删除触发器的语法如下:
`DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name`
实例:
1、删除触发器‘t_afterdelete_on_tab1’
sql命令:
`DROP TRIGGER IF EXISTS t_afterdelete_on_tab1`
评论