触发程序:用户定义在数据表上的一类由事件驱动的特殊过程。
任何用户对表的增删改操作均由服务器自动激活相应的触发程序。
通过触发程序,可以使多个不同的用户能够在保持完整性 和一致性的环境中进行修改操作。
1. 触发程序的定义
触发程序: 是一种特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是通过事件进行触发来被执行的,当对一个表进行操作时就会激活它并执行
2. 触发程序的创建
语法
create trigger <触发程序名称>
{before / after}
{insert / update / delete}
on <表名>
for each row
<触发程序SQL语句>
- 表导拥有者即创建者可以在表上创建触发程序,一个表上可以创建多个触发程序
- on <表名> :用于指定响应该触发程序的表名。必须引用永久性表,不能将触发程序与TEMPORARY表或视图关联起来。
- for each row: 触发程序的执行间隔,通知触发程序每隔一行执行一次动作,而不是对整个表执行一次。
- <触发程序SQL语句>:触发程序要执行的SQL语句。如果多条语句,放在begin…end块中。
触发程序名称存放在方案的名称空间内,1个方案中所有触发程序名称唯一,不同方案可以有相同名称
对应具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
示例1
CREATE TABLE stu(
sno INT PRIMARY KEY,
sname VARCHAR(20)
);
CREATE TABLE num_stu(
num INT
);
--触发程序
CREATE TRIGGER tri_stu
AFTER INSERT
ON stu
FOR EACH ROW
UPDATE num_stu
SET num = num + 1;
INSERT INTO num_stu VALUE(0);
INSERT INTO stu VALUE(1, 'mike');
SELECT * FROM num_stu;
示例2
CREATE TABLE emp(
empno INT,
empname VARCHAR(20),
sal DECIMAL(7, 2)
);
--触发程序
CREATE TRIGGER tri_emp
BEFORE INSERT
ON emp
FOR EACH ROW
BEGIN
IF new.sal<5000 THEN
SET new.sal=5000;
END IF;
END
INSERT INTO emp VALUES(1, 'mike', 2300);
SELECT * FROM emp;
3. 触发程序的操作
3.1 查看触发程序
方式1
语法
SHOW TRIGGERS [from db_name] [like expr]
{expr} 会与触发程序定义时所在表的名称相比较,而不与触发程序的名称相比较
示例
show triggers like 'emp';
方式2
已经定义好的触发程序信息都存储在information_schema库中的triggers表中
语法
SELECT * FROM information_schema.`TRIGGERS` WHERE CONDITION
- trigger:触发程序的名称
- event:调用触发程序的时间。必须为insert / update / delete 之一。
- table: 触发程序定义时对应的表
- statement: 执行语句
- timing: before 或 after 两个值之一
- created: 目前,本列的值为null.
示例
SELECT * FROM information_schema.`TRIGGERS` WHERE trigger_name='tri_emp';
- trigger_schema: 触发程序所在数据库的名称
- trigger_name: 触发程序的名字
- event_manipulation: 触发动作
- event_object_schema: 相应的数据库
- event_object_table: 相应的触发程序相关的表名
3.2 删除触发程序
语法
drop {database / schema} {if exists} trigger_name
- schema: 表示数据库的名称,schema_name是可选的,如果省略不写,将从当前数据库中删除触发程序。
语法
drop trigger if exists tri_emp;