如何解决在SQL表中插入后创建用户
每当我在表中插入带有用户名的行时,我都希望使用相同的初始密码创建一个新用户。
我尝试过,但是不起作用:
CREATE TABLE IF NOT EXISTS Professeur (
professeur_id int NOT NULL AUTO_INCREMENT,prenom varchar(40) COLLATE utf8_bin NOT NULL,name varchar(30) COLLATE utf8_bin NOT NULL,titre char DEFAULT NULL,PRIMARY KEY (professeur_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE trigger trig_prof AFTER INSERT ON Professeur
FOR EACH ROW CREATE OR replace USER NEW.name@localhost identified BY pwd0;
错误:
ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near
'USER NEW.name@localhost identified BY pwd0' at line 2
解决方法
触发器具有fine manual中所述的一些限制:
“触发器无法对mysql,information_schema或performance_schema数据库中的任何表进行操作。”
由于用户存储在mysql模式中(无论是global_priv还是user),因此无法使用。
,以不同的方式做事...
编写一个存储过程,该过程既创建表又添加用户。有关如何临时授予最终用户root权限的信息,请参见SQL SECURITY DEFINER
。但是请注意安全隐患。
然后,要添加表和用户,它是一个CALL
语句。
问题可以通过瑞克·詹姆斯(Rick James)所建议的程序以及准备好的语句https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
来解决。我在脚本中添加了以下代码,并执行了源命令SOURCE initdb_gestiondesnotes.SQL
此后,我使用以下命令调用该过程:CALL create_professeur();
DELIMITER $$
CREATE PROCEDURE CREATE_PROFESSEUR()
BEGIN
DECLARE v_a INT Default 1 ;
DECLARE v_nom VARCHAR(42);
DECLARE v_prenom VARCHAR(42);
DECLARE v_login VARCHAR(84);
DECLARE v_titre VARCHAR(5);
DECLARE v_pwd VARCHAR(5);
SET v_pwd = 'p';
simple_loop: LOOP
SET v_nom = CONCAT("prof",LPAD(CAST(v_a AS CHAR),3,'0'));
SET v_prenom = CONCAT("prenom",'0'));
SET v_titre = CASE WHEN RAND() > .5
THEN 'M'
ELSE 'F' END;
INSERT INTO Professeur (prenom,nom,titre) VALUES (v_prenom,v_nom,v_titre);
SET v_login = CONCAT(v_prenom,v_nom);
SET @sql1 = CONCAT('CREATE OR REPLACE USER ',v_login,'@localhost identified BY \'p\' ');
PREPARE stm1 FROM @sql1;
EXECUTE stm1;
SET @sql2 = CONCAT('GRANT role_professeur TO ','@localhost');
PREPARE stm2 FROM @sql2;
EXECUTE stm2;
SET @sql3 = CONCAT('SET DEFAULT ROLE role_professeur FOR ','@localhost');
PREPARE stm3 FROM @sql3;
EXECUTE stm3;
SET v_a=v_a+1;
IF v_a=51 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
DEALLOCATE PREPARE stm1;
DEALLOCATE PREPARE stm2;
DEALLOCATE PREPARE stm3;
END $$
DELIMITER ;
现在我有50个用户,其中prenom001prof001
,prenom002prof002
...作为登录名,'p'作为密码。再次使用准备好的语句,我给每个用户一个role_professeur
的角色。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。