Mysql 在SQL表中插入后创建用户
每次在表中插入带有用户名的行时,我都希望创建一个具有相同初始密码的新用户 我试过了,但没用:Mysql 在SQL表中插入后创建用户,mysql,sql,mariadb,Mysql,Sql,Mariadb,每次在表中插入带有用户名的行时,我都希望创建一个具有相同初始密码的新用户 我试过了,但没用: 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, PRIMA
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
触发器有几个限制,如中所述: “触发器不能对mysql、信息模式或性能模式数据库中的任何表进行操作。”
由于用户存储在mysql模式中(无论是全局私有模式还是用户模式),所以这无法工作。以不同的方式做事 编写一个既创建表又添加用户的存储过程。有关如何临时授予最终用户根权限的信息,请参见
SQL安全定义程序。但要注意安全问题
然后,要添加表和用户,需要一个调用语句。问题通过Rick James建议的过程和准备好的语句解决
我将以下代码放入脚本中,并执行source命令source initdb\u gestiondesnotes.SQL
之后,我使用以下命令调用该过程:callcreate_professeur()代码>
现在我拥有50名用户,拥有prenom001prof001
,prenom002prof002
。。。作为登录名,“p”作为密码。同样,通过准备好的语句,我给每个用户分配了role\u professeur
(1)您的表中没有密码列。(2) “Professeur”是用户表的奇数名称。(3) 我当然希望你没有存储免费文本密码。你应该在你的“it's not work:”声明中发布一个错误。witch对我们来说没有任何意义。“我给你加的。”戈登林诺夫。(1) 我不想在我的表中存储密码。(2) “Professeur”在法语中是指教师(3)不,我不是。我想用相同的密码初始化每个用户帐户。之后,他们可以选择自己的密码。好的,谢谢。所以我必须找到另一种方法:游标和循环?在插入完成后,您应该从应用程序代码中执行创建用户。@BillKarwin它是计划好的。但是,出于演示的目的,使用sql脚本,我使用一个虚拟教师列表初始化教师表,我想授予这些虚拟教师与教师的sql角色连接的权限。sql脚本将作为root用户执行,因此没有问题。我知道怎么做了:还有什么要知道的吗?
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", LPAD(CAST(v_a AS CHAR), 3, '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 ', v_login, '@localhost');
PREPARE stm2 FROM @sql2;
EXECUTE stm2;
SET @sql3 = CONCAT('SET DEFAULT ROLE role_professeur FOR ', v_login, '@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 ;