文章目录
参考链接:
一篇非常好的讲解触发器的文章:示例、原理MySQL/MariaDB触发器。
用触发器自动加密的应用文章mysql触发器-插入更新数据时字段值自动加密。
delimiter的作用可以参考这里。
代码
插入时,自动加密
sql
-- 删除原先的触发器
DROP TRIGGER IF EXISTS 【触发器名,如t_insert_tbStu_oValue】;
-- 创建触发器
DELIMITER $$
CREATE TRIGGER 【触发器名,如t_insert_tbStu_oValue】
BEFORE INSERT ON 【表名】FOR EACH ROW -- 触发在这张表新增数据前
BEGIN -- 要执行的sql list 开始
IF new.【列名】 IS NOT NULL THEN
SET new.【列名】 = to_base64(aes_encrypt(new.【列名】,"【你的密码】"));
END IF;
END;
END; $$
DELIMITER ;
在MySQL/MariaDB中,
new 表 : 表示向表中插入新记录之前,新记录保存在new表中,即inserted表。
对应的,old表 表示删除目标记录之后将删除的记录保存在old表中,即deleted表。
而update操作 基本可以认为是先delete再insert的行为,所以也会触发这两张表。
sql中可以引用这两张表中的列,例如引用
old.col_name
。
另外:
DELIMITER 默认是
;
,但是可以指定成其他的,例如由$$
字代替,这样,在指定时DELIMITER $$
和再次出现表示语句结束的$$
之间,就可以出现;
(不作为分隔符,但是可以作为嵌套的语句的结束),并且作为整体的一部分来执行。
更新时,自动加密
使用update语句时,插入的值,会是加密后的数据。
sql
DROP TRIGGER IF EXISTS 【触发器名,如t_update_tbStu_oValue】;
DELIMITER $$
CREATE TRIGGER 【触发器名,如t_update_tbStu_oValue】 -- 创建触发器
BEFORE UPDATE ON 【表名】 FOR EACH ROW
BEGIN -- 要执行的sql list 开始
IF new.【列名】IS NOT NULL THEN
SET new.【列名】= TO_BASE64 (AES_ENCRYPT (new.【列名】,'【你的密码】'));
END IF;
END;$$
DELIMITER ;
查看触发器
sql
SHOW TRIGGERS;
数据操作示例
update数据
bash
USE 【数据库名】;
SHOW TRIGGERS;
SELECT * FROM 【表名】LIMIT 10;
update 【表名】 SET oValue = 2
WHERE oName = "【筛选条件】";
SELECT * FROM 【表名】 LIMIT 10;
取出
直接取
sql
SELECT oValue
FROM 【表名】
WHERE oName = "【筛选条件】";
解密取
sql
SELECT AES_DECRYPT(FROM_BASE64(oValue), '【你的密码】')
FROM
(SELECT oValue
FROM 【表名】
WHERE oName = "【筛选条件】")
as oValue;
注意
一次尝试,看加密后数据长度
sql
-- 判断数据长度
-- 源数据 120位
SELECT TO_BASE64(AES_ENCRYPT('yML93Cb2ZYnwrRUSyc+5ETicNwfbpVRKe03XGlSXHOKvA3lMWnHCof8wFnsaYwVWMvBl6YssUbQt/MngjFUbSW709eFr1nsOcSSZy9wn61nDvZN5qm1mypDN','【我的密码】'));
-- 结果 172位
'oGxxBBxQVjN2CoVxiZ08dX3BLb9xCEFwQqEk4eZJjwVtuGHKYjyfsy+fBp66euJMwts8Fzv0rnQSisrdCopKS1HSx5YUmRUsEsZubPp7BepIqjwVEtU9uCCJXetFlhIcjyapt+clGVZx4gici4B6jPsKP2DB3C1nYq9FsJBS1Ts='