如何在远程服务器的MySQL触发器中不依赖主机名校验当前用户
解决MySQL触发器中忽略主机名校验用户名的问题
要摆脱对主机名的依赖,只校验登录用户名的部分,可以用MySQL的SUBSTRING_INDEX()函数提取CURRENT_USER()返回值中的用户名部分,该函数能以指定字符为分隔符截取字符串的前半段。
修改后的触发器代码
create definer = mysqldev@localhost trigger trigger_update after update on products for each row BEGIN DECLARE newStatus varchar(1); DECLARE currentUsername varchar(50); -- 新增变量存储纯用户名 SET newStatus = NEW.status; -- 提取@符号前的纯用户名,不受后面主机名影响 SET currentUsername = SUBSTRING_INDEX(CURRENT_USER(), '@', 1); IF newStatus = 'D' THEN -- 仅superadmin可编辑已完成任务 IF (currentUsername != 'superadmin') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Only superadmin can edit completed task !'; END IF; END IF; END;
原理说明
CURRENT_USER()返回格式固定为用户名@主机名,SUBSTRING_INDEX(CURRENT_USER(), '@', 1)会截取@符号之前的所有内容,得到纯用户名。不管远程服务器的主机名是localhost还是其他任意值,都能准确获取到登录的用户名,彻底避免了主机名变化带来的校验失效问题。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

