基本上,我试图创建一个存储过程,其中包含一个if else语句,该语句检查mysql服务器版本,并根据该版本执行一个具有正确mysql语法的create用户来创建用户。我们有一个mysql 5和mysql 8服务器,根据客户的选择,我们需要在特定的服务器版本(即mysql 8或5)上创建一个用户。
USE test;
DROP PROCEDURE IF EXISTS add_user ;
CREATE PROCEDURE add_user()
BEGIN
IF (SELECT VERSION() = '5.7.20-log') THEN
GRANT ALL PRIVILEGES ON test.* TO 'akoos'@'localhost' IDENTIFIED BY 'Password';
ELSE
CREATE USER 'akoos'@'localhost' IDENTIFIED BY 'Password';
GRANT ALL ON test.* TO 'akoos'@'localhost';
END IF ;
FLUSH PRIVILEGES;
END
;
CALL add_user() ;
DROP PROCEDURE IF EXISTS add_user ;我尝试过这样做,但是我不断地得到语法错误,我所需要做的就是创建一个具有正确语法的存储过程,以创建用户,并根据其执行的服务器版本授予特权。如果它的5执行用于创建用户的mysql 5代码,如果它的mysql 8以mysql 8语法执行用于创建用户的代码。我需要这样做的原因是我们使用的wordpress intaller有一个mysql脚本,它创建了下面的代码
Mysql 5代码
USE test;
DROP PROCEDURE IF EXISTS add_user ;
CREATE PROCEDURE add_user()
BEGIN
GRANT ALL PRIVILEGES ON test.* TO 'akoos'@'localhost' IDENTIFIED BY 'Password';
FLUSH PRIVILEGES;
END
;
CALL add_user() ;
DROP PROCEDURE IF EXISTS add_user ;Mysql 8需要使用以下语法来创建用户
CREATE USER 'akoos'@'localhost' IDENTIFIED BY 'Password';
GRANT ALL ON test.* TO 'akoos'@'localhost';因此,我想使用if the语句根据所使用的db服务器版本创建存储的proc。
发布于 2022-11-01 16:29:48
对于这两个版本,您都应该使用CREATE USER / GRANT方法。
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_auto_create_user说:
最好是用create而不是GRANT创建MySQL帐户。不推荐使用NO_AUTO_CREATE_USER,默认的SQL模式包括NO_AUTO_CREATE_USER。更改sql_mode模式状态的赋值将产生警告,但将sql_mode设置为默认的赋值除外。预期NO_AUTO_CREATE_USER将在将来的MySQL发行版中被删除,并且它的效果将在任何时候都启用(并且格兰特不再创建帐户)。
虽然在MySQL 8.0中强制不能通过授予用户权限来隐式创建用户,但让NO_AUTO_CREATE_USER模式在MySQL 5.x中生效也是一个好主意。无论您使用什么版本,都应该显式地创建用户。
因此,不需要您的条件代码。
如果您确实想编写条件代码,可以这样引用系统变量:
IF (@@version = '5.7.20') THEN
...-log后缀可能存在,也可能不存在。在每个日志都有其他配置变量之前,MySQL表示启用了一个查询日志或二进制日志,这是一种古老而古老的方式。版本变量的这一奇怪特性在MySQL 8.0中不再使用(最后)。但在这两个版本中,可能都有另一个后缀-debug表示MySQL服务器实例正在运行调试版本。
所以测试这个变量的一个更好的方法是:
IF (LEFT(@@version, 2) = '5.') THEN
...那么,您就不必担心版本后缀,或者版本后缀是5.6对5.7,或者是5.7.21对5.7.40。
https://stackoverflow.com/questions/74278480
复制相似问题