使用存储过程将用户添加到数据库

时间:2019-02-07 19:35:12

标签: mysql stored-procedures mariadb

我正在尝试创建一个存储过程,该存储过程可以授予用户访问数据库的权限。想法是该过程将采用一个参数(给定的用户名),然后授予用户访问数据库的权限。因此,执行此操作的常规Mariadb查询是:

GRANT ALL ON databaseNameHere.* TO 'userNameHere'@'%';

问题是,“ userNameHere”需要用引号引起来才能执行此查询,因此我需要将引号连接到给定的用户名参数。 我以为是这样用DECLARE做到的:

DELIMITER $$
CREATE PROCEDURE GrantUserAccess(IN as_username CHAR(25)) 
BEGIN
  SET @sql = CONCAT("GRANT ALL ON archimodels.* TO '" as_username "'@'%'")
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$

DELIMITER ;

我一直遇到错误声明:

  

您的SQL语法有错误;检查手册   对应于您的MariaDB服务器版本,以使用正确的语法   靠近'“'@'%'”))从@sql准备stmt;执行stmt;取消分配   准备stmt; EN'在第3行

这是我要执行的操作的一个示例,唯一的问题是我需要将引号连接到用户名 https://www.oreilly.com/library/view/mysql-stored-procedure/0596100892/re39.html

1 个答案:

答案 0 :(得分:1)

有几处错误。

1)用“智能引号”卷曲引号和双引号字符代替ASCII引号和双引号字符

2)要将过程参数或变量的内容包含在SQL语句的文本中,我们需要使用动态SQL PREPARE / EXECUTE / DEALLOCATE

我们还需要确保传入的参数有效;如果用户不存在,则GRANT语句将创建没有密码的用户。而且如果参数恰好包含单引号字符,那么如果我们不对它进行转义,那将破坏我们的SQL。我们可能还会考虑使用TRIM()函数从参数中删除任何前导或尾随空格。

类似这样的东西:

DELIMITER $$

CREATE PROCEDURE GrantUserAccess(IN as_username CHAR(25)) 
BEGIN
  SET @sql = CONCAT('GRANT ALL ON databaseNameHere.* TO '''
               ,REPLACE(as_username,'''','''''')
               ,'''@''%''' );
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
  SET @sql = '';
END$$

DELIMITER ;