在MySQL 5.7上无效的存储过程语法,但在MariaDB上有效

杰森·艾伦:

我正在尝试编写一个MySQL脚本,以将管理员用户添加到服务器上的每个WordPress数据库中,并更新用户名中已存在的用户信息。

我编写了以下脚本,并且该脚本可在具有innodb_version 5.7.29的MariaDB 10.2.31的服务器上运行,但是在运行MySQL Community Server 5.7.29的服务器上无法正常工作,我收到一条错误消息:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS (SELECT * FROM cpaneluser_wp.wp_users WHERE user_login = 'newwpuser') THEN' at line 1

这是创建存储过程的脚本:

-- Create and update a WordPress administrator across all databases
USE mysql;

delimiter $$

DROP PROCEDURE IF EXISTS ensure_global_wp_user $$

CREATE PROCEDURE ensure_global_wp_user(
  IN username VARCHAR(255),
  IN email VARCHAR(255),
  IN password VARCHAR(255),
  IN nicename VARCHAR(255),
  IN displayname VARCHAR(255)
)
BEGIN

DECLARE current_schema VARCHAR(255);
DECLARE finished INTEGER DEFAULT 0;

DECLARE wp_schemas CURSOR FOR
  SELECT DISTINCT table_schema
    FROM INFORMATION_SCHEMA.tables
    WHERE table_name = 'wp_users';

DECLARE CONTINUE HANDLER
  FOR NOT FOUND
  SET finished = 1;

OPEN wp_schemas;

DROP TEMPORARY TABLE IF EXISTS exec_results;
CREATE TEMPORARY TABLE IF NOT EXISTS exec_results (
  username VARCHAR(255),
  dbname VARCHAR(255),
  action VARCHAR(255)
);

loopSchemas: LOOP
  FETCH wp_schemas INTO current_schema;
  IF finished = 1 THEN
    LEAVE loopSchemas;
  END IF;

  SET @expression = CONCAT("
    IF EXISTS (SELECT * FROM ",current_schema,".wp_users WHERE user_login = '",username,"') THEN
      UPDATE ",current_schema,".wp_users
        SET
          user_pass = MD5('",password,"'),
          user_email = '",email,"',
          user_nicename = '",nicename,"',
          display_name = '",displayname,"'
        WHERE user_login = '",username,"';
      INSERT INTO exec_results VALUES ('",username,"','",current_schema,"','updated');
    ELSE
      INSERT INTO ",current_schema,".wp_users (user_login, user_pass, user_nicename, user_email, user_status, display_name, user_registered) VALUES
        ('",username,"', MD5('",password,"'), '",nicename,"', '",email,"', '0', '",displayname,"', NOW());
      SET @user_insert_id = LAST_INSERT_ID();
      INSERT INTO ",current_schema,".wp_usermeta (user_id, meta_key, meta_value) VALUES
        (@user_insert_id, 'wp_capabilities', 'a:1:{s:13:\"administrator\";b:1;}');
      INSERT INTO ",current_schema,".wp_usermeta (user_id, meta_key, meta_value) VALUES
        (@user_insert_id, 'wp_user_level', '10');
      INSERT INTO exec_results VALUES ('",username,"','",current_schema,"','added');
    END IF;
  ");
  PREPARE stmt FROM @expression;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END LOOP loopSchemas;

CLOSE wp_schemas;

SELECT * FROM exec_results;

END $$

delimiter ;

您可以这样称呼它:

-- Create or update the newwpuser user on all wordpress databases
call ensure_global_wp_user('newwpuser', '[email protected]', 'newpassword', 'newwpuser', 'newwpuser');

是否有其他语法可以实现这一目标?我也尝试设置sql_mode为,''但是没有任何区别。

nbk:

您的@expression在mysql中无效。

试试这个,当然没有你的桌子我无法完全测试它

现在我首先通过另一个准备好的语句来确定,如果用户存在,则返回1表示现有状态,否则返回0。

并使用该ti确定在不存在现有ot插入时应使用和更新的方式。

Thbis也应该在mariadb中工作。

DROP procedure IF EXISTS `ensure_global_wp_user`;

DELIMITER $$
USE `testdb`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ensure_global_wp_user`(
  IN username VARCHAR(255),
  IN email VARCHAR(255),
  IN password VARCHAR(255),
  IN nicename VARCHAR(255),
  IN displayname VARCHAR(255)
)
BEGIN

DECLARE current_schema VARCHAR(255);
DECLARE finished INTEGER DEFAULT 0;

DECLARE wp_schemas CURSOR FOR
  SELECT DISTINCT table_schema
    FROM INFORMATION_SCHEMA.tables
    WHERE table_name = 'wp_users';

DECLARE CONTINUE HANDLER
  FOR NOT FOUND
  SET finished = 1;

OPEN wp_schemas;

DROP TEMPORARY TABLE IF EXISTS exec_results;
CREATE TEMPORARY TABLE IF NOT EXISTS exec_results (
  username VARCHAR(255),
  dbname VARCHAR(255),
  action VARCHAR(255)
);

loopSchemas: LOOP
  FETCH wp_schemas INTO current_schema;
  IF finished = 1 THEN
    LEAVE loopSchemas;
  END IF;
SET @sql = CONCAT("SELECT  EXISTS (SELECT * FROM ",current_schema,".wp_users WHERE user_login = '",username,"') INTO @res;");
  PREPARE stmt FROM @sql;
  EXECUTE stmt;

    IF @res = 1 THEN
      SET @expression = CONCAT("UPDATE ",current_schema,".wp_users
        SET
          user_pass = MD5('",password,"'),
          user_email = '",email,"',
          user_nicename = '",nicename,"',
          display_name = '",displayname,"'
        WHERE user_login = '",username,"';
      INSERT INTO exec_results VALUES ('",username,"','",current_schema,"','updated');");
    ELSE
      SET @expression = CONCAT("INSERT INTO ",current_schema,".wp_users (user_login, user_pass, user_nicename, user_email, user_status, display_name, user_registered) VALUES
        ('",username,"', MD5('",password,"'), '",nicename,"', '",email,"', '0', '",displayname,"', NOW());
      SET @user_insert_id = LAST_INSERT_ID();
      INSERT INTO ",current_schema,".wp_usermeta (user_id, meta_key, meta_value) VALUES
        (@user_insert_id, 'wp_capabilities', 'a:1:{s:13:\"administrator\";b:1;}');
      INSERT INTO ",current_schema,".wp_usermeta (user_id, meta_key, meta_value) VALUES
        (@user_insert_id, 'wp_user_level', '10');
      INSERT INTO exec_results VALUES ('",username,"','",current_schema,"','added');");
    END IF;

  PREPARE stmt FROM @expression;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END LOOP loopSchemas;

CLOSE wp_schemas; 

SELECT * FROM exec_results;

END$$

DELIMITER ;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在mysql 5中有效但在mysql 8中无效的这种语法有什么问题

MySQL连接在Localhost上有效,但在Web服务器上无效

Group by、Order by 在 MySQL 中有效,但在 MariaDB 中无效

HTML5 AppCache:应用程序缓存在开发服务器上有效,但在IIS 7.5上无效

此查询在 mysql 上有效,但在 PHP 上返回 0(倒序虽然有效)

为什么此创建表SQL在MSSQL Server中有效但在MySQL上无效?

JDBC MySQL连接在某些Tomcat上有效,但在其他MySQLs上失败,并带有MySQLNonTransientConnectionException

MySQL 查询在 mysql 工作台中有效,但在 python 脚本中无效

图形在Chrome上有效,但在Firefox上无效

CurrentItem在iOS上无效,但在Android上有效

DelegatingHandler在Localhost上有效,但在Azure上无效

约束在iOS 8上有效,但在iOS 7上无效

Delphi TNetHTTPRequest / TNetHTTPClient在Win 10上有效,但在Win 7上无效

对象!= nil在Beta 5中有效,但在Beta 6中无效吗?

Angular 5 路由有效,但在更改浏览器 url 时无效

Python MySQLdb转义字符:查询在MySQL中有效,但在python MySQLdb中无效

MySQL UPDATE 在 phpMyAdmin 中有效,但在 PHP 中无效

mysql查询在phpmyadmin中有效,但在node.js中无效

连接到wampserver MySQL在PHP中有效,但在vb.NET中无效

MySQL存储过程语法

MySQL / MariaDB故障排除存储过程语法错误

MySQL存储功能在Laravel中造成访问冲突:1305,但在phpmyadmin中有效

在MySQL中存储MD5

实体框架代码优先迁移在EF5中有效,但在EF6中无效

使用左联接查询并选择中的计数在MySQL中有效,但在MS SQL Server 2012中无效

为什么 'n = 5 是有效的语法?[Scala]

HTML5有效还是无效?

新字段在localhost上有效,但在Heroku上无效

写入HID键盘在Linux上有效,但在Windows上无效