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