一,创建trigger
语法:
CREATE
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
该语句创建一个新的触发器。触发器是与表相关联的命名数据库对象,并在表发生特定事件时激活。触发器与名为的表相关联,该表 tbl_name必须引用一个永久表。不能将触发器与TEMPORARY表或视图(view)关联 。
下面分别来说明一下语句中各个参数含义;
1.trigger_name
触发器名称,跟表名一样;每个触发器都有一个名字;
2. trigger_time
触发时机,表示在某种事件发生之前或者发生之后激活该trigger,有2种取值:
trigger_time取值 |
---|
before |
after |
3. trigger_event
触发事件,表示在发生某种事件时激活该trigger,有3种取值
trigger_event取值 |
---|
update |
delete |
insert |
4.tbl_name
表示该trigger是关联哪一张表做事件的触发;
5.trigger_body
是触发器激活时要执行的语句;这个是重点,表示该触发器具体要干什么事;以begin end 做开头和结尾;
举个例子:现在有2张表;score,log;现在想要做一个触发器,在score表插入数据之后,在log表中记录user的插入时间;
create
trigger trigger_score
after insert on score for each row
begin
insert into log(times) value(now());
end
二, 删除trigger
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
【如果删除表,表的触发器也将被删除。】
schema_name:其实就是databaseName(数据库名),以上面的例子为例,score表在database 为:ssm,那trigger_score 的schema_name=ssm
以上面的例子为例,要删除触发器:trigger_score ;
drop trigger ssm.trigger_score
三,查询trigger
有2种方法:
1.查询所有的trigger
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS;
查询结果包含以下列(还有其他列,没有写完整):
TRIGGER_CATALOG | 触发器所属的目录的名称。此值始终为def。 |
---|---|
TRIGGER_SCHEMA | 触发器所属的架构(数据库)的名称 |
TRIGGER_NAME | 触发器的名称。 |
EVENT_MANIPULATION | 触发事件(update,insert,delete) |
ACTION_STATEMENT | 定义了trigger具体做什么事,就是trigger_body |
ACTION_TIMING | 触发器是在触发事件之前还是之后激活:AFTER,BEFORE |
CREATED | 创建触发器的日期和时间 |
DEFINER | 创建触发器的用户;格式为: user_name@host_name |
EVENT_OBJECT_SCHEMA和 EVENT_OBJECT_TABLE | 每个触发器都与一个表正好关联。这些列分别指示此表所在的目录和架构(数据库)以及表名称 |
看完以上信息就可以还原出创建trigger的语句了;
2.查询出当前数据库的trigger
SHOW TRIGGERS
[{FROM | IN} db_name]
[LIKE 'pattern']
列出当前为数据库中的表定义的触发器(默认数据库,除非FROM给出子句)。
该语句仅返回用户具有TRIGGER 权限的数据库和表的结果。
LIKE子句(如果存在)指示要匹配的表名(而不是触发器名),并使该语句显示那些表的触发器
使用举例:
show TRIGGERS in ssm like 'score%';
表示查询在 database为ssm中,表名前缀匹配:score的所有表的trigger