触发器概念
当表发生改变(insert、update、delete)时触发的动作。 触发器是依赖于表创建,没有表就没有触发器;一般来说每个表都有触发器的限制,一般最多支持6个不同类型的触发器。触发器和用户自定义函数的不同之处在于触发事件发生时会自动调用。
MySQL触发器
- 创建触发器: create trigger 触发器名称 触发动作 on 表名 for each row [触发事件]
- 删除触发器:drop trigger 触发器名称;
- 查看触发器:show triggers;
-- insert 触发器
CREATE TRIGGER insertUser AFTER INSERT ON user FOR EACH ROW
SELECT NEW.name INTO @name
-- INSERT into userhistory(name,type)(select NEW.name,'1')
-- 删除触发器
drop trigger insertUser
-- 检测插入触发器
INSERT INTO user(name) VALUES ('小猪');
INSERT INTO user(name) VALUES ('小猫');
-- 主键自增
alter table user modify id integer auto_increment
alter table userhistory modify id integer auto_increment
-- DELETE触发器
CREATE TRIGGER delUser AFTER delete ON user FOR EACH ROW
-- SELECT OLD.name INTO @name;
INSERT into userhistory(name,type)(SELECT OLD.name,'3')
-- 删除触发器
drop trigger delUser
-- 检测删除触发器
delete from user where `id` = 0;
select @name
PostgreSQL触发器
- 创建触发器函数(create function)
- 创建触发器( create trigger)
- 案例
- 管理触发器
语法
-- 创建触发器函数
create function trigger_function()
returns trigger
language 'plpgsql'
as $BODY$
begin
sqlstatement
return new;
end;
$BODY$;
触发器函数与普通函数类似,不同之处在于触发器不需要任何参数,并且触发器函数需要返回trigger类型值
-- 创建触发器,将触发器函数绑定数据库表
create trigger trigger_name
{before | after | instead of} event1 or event2...
on table_name
{for each row | for each statement}
execute procedure trigger_function;
event1: 事件可以是:insert, update, delete, truncate
before: 表示定义触发器在事件之前
after: 表示定义触发器在事件之后
intead of: 表示仅用于视图的insert, update, delete
for each row:表示行级触发器
for each statement:表示语级触发器
案例
-- 创建触发器函数
CREATE or replace FUNCTION userTrigger_function()
RETURNS trigger
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
UPDATE user_task set "state" ='0';
return NULL;
END;
$BODY$;
-- 创建触发器,将触发器函数绑定数据库表
CREATE TRIGGER userInsert AFTER INSERT OR UPDATE OR DELETE ON "user"
FOR EACH ROW
EXECUTE PROCEDURE userTrigger_function();
-- 删除触发器
drop trigger userInsert on user
管理触发器
删除触发器:
drop trigger [if exists] trigger_name on table_name [cascade | restrict];
[cascade:级联删除触发器;restrict:被引用时禁止删除]
修改触发器:
alter trigger trigger_name on table_name rename to new_name;
禁用触发器:
禁用该表上的一个触发器
alter table table_name disable trigger trigger_name;
禁用该表上的所有触发器
alter table table_name disable trigger all;
【注】:禁用后的触发器仍然存在于数据库中,只是不触发事件而已。