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

标签 mysql stored-procedures mariadb

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

将所有数据库名称Here.* 授予'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 ;

我不断遇到错误语句:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"'@'%'") PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; EN' at line 3

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

最佳答案

有一些问题。

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 ;

关于mysql - 使用存储过程将用户添加到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54580978/

相关文章:

sql - T-SQL 存储过程中的空比较

java - 参数号 1 不是 OUT 参数

具有自定义 'table-like' 输出的 mysql 过程

php - SQLSTATE[HY000] [1045] 用户 'test' @'localhost' 的访问被拒绝(使用密码 : YES)

android - 用于 Android MySQL 连接的 Mono

php 从 mysql 获取 ▒ 而不是 æøå

php - MariaDb 不支持 ANY_VALUE() 函数

mysql - 子查询 MYSQL 以从服务器选择所有数据库

python - Django unique_together 但仅用于过滤

mysql - 与时间属性有关的设计数据库