Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL表中插入后创建用户_Mysql_Sql_Mariadb - Fatal编程技术网

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 ;