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