MySQL.user表SQL插入语句及触发器创建问题求助
搞定MySQL插入语句和触发器的问题
一、先修复那个跑不起来的INSERT语句
你原来的插入语句用了?占位符,这是给程序里的预处理语句用的,直接在MySQL Workbench里执行肯定报错。咱们把占位符换成实际值就行——ssl_cipher、x509_issuer、x509_subject这仨字段如果不需要SSL加密配置,直接设为NULL就好(它们默认允许为空)。
改好的插入语句是这样:
INSERT INTO `mysql`.`user` (`Host`, `User`, `ssl_cipher`, `x509_issuer`, `x509_subject`) VALUES ('%', 'User1', NULL, NULL, NULL);
执行完记得刷新权限,不然新用户的权限不会生效:
FLUSH PRIVILEGES;
二、再修正你的触发器代码
你的触发器写得有点问题,我给你捋顺:
- 触发器里要引用刚插入到
BBDD.users的行数据,得用NEW.字段名,比如NEW.name,不能写BBDD.users(name); - SSL相关字段还是设为
NULL就行; - 另外要注意,操作
mysql.user表需要很高的权限,得用root或者有全局权限的用户来创建触发器; - 触发器里如果涉及多个语句,得先改一下分隔符,不然MySQL会把第一个分号当成语句结束。
修正后的触发器代码:
DELIMITER // CREATE TRIGGER new_user AFTER INSERT ON BBDD.users FOR EACH ROW BEGIN INSERT INTO `mysql`.`user` (`Host`, `User`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `authentication_string`) VALUES ('%', NEW.name, NULL, NULL, NULL, NEW.password); FLUSH PRIVILEGES; END // DELIMITER ;
额外提醒几句
- 其实MySQL官方不推荐直接操作
mysql.user表来创建用户,更好的方式是用CREATE USER语句,比如CREATE USER 'User1'@'%' IDENTIFIED BY '你的密码';,如果要在触发器里自动创建用户,也可以把INSERT语句换成CREATE USER; - 要是你的MySQL版本是5.6及更早,密码字段是
password而不是authentication_string,记得把字段名换掉,而且最好用PASSWORD()函数加密密码再存; - 确保
BBDD.users表的password字段存的是符合MySQL要求的加密密码,不然新创建的用户可能登不上数据库。
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

