Странности в твоём коде начинаются с первых же строчек. Например, в:
CREATE TABLE DB.users (
name VARCHAR(64),
pass VARCHAR(255)
);
полностью отсутствует создание первичного ключа.
Создание множества пользователей и идентичных таблиц отдельно для каждого пользователя... ЗАЧЕМ??? Какую именно задачу ты пытаешься решить таким сомнительным способом?
Create database recovery;
DROP DATABASE IF EXISTS DB;
CREATE DATABASE DB;
CREATE TABLE DB.users (
name VARCHAR(64),
pass VARCHAR(255)
);
use DB;
SET @key = 'test';
DROP PROCEDURE IF EXISTS create_users;
DELIMITER //
CREATE PROCEDURE create_users()
BEGIN
SET @counter = 1;
WHILE (@counter <= 14) DO
SET @user_name = CONCAT('''', 'user', @counter, '''', '@''localhos''');
SET @query = CONCAT('DROP USER IF EXISTS ', @user_name);
PREPARE state FROM @query;
EXECUTE state;
SET @user_pass = SUBSTRING(MD5(RAND()) FROM 1 FOR 5);
SET @query = CONCAT('CREATE USER ', @user_name, ' IDENTIFIED BY ''', @user_pass, '''');
PREPARE state FROM @query;
EXECUTE state;
SET @user_pass = HEX(AES_ENCRYPT(@user_pass, @key));
SET @query = CONCAT('INSERT INTO DB.users (name, pass) VALUES (', '''', 'user', @counter, '''', ', ', '''', @user_pass, '''', ')');
PREPARE state FROM @query;
EXECUTE state;
SET @counter = @counter + 1;
END WHILE;
END
//
DELIMITER ;
DROP PROCEDURE IF EXISTS create_dbs;
DELIMITER //
CREATE PROCEDURE create_dbs()
BEGIN
SET @counter = 1;
WHILE (@counter <= 14) DO
SET @db_name = CONCAT('DB', @counter);
SET @query = CONCAT('DROP DATABASE IF EXISTS ', @db_name);
PREPARE state FROM @query;
EXECUTE state;
SET @query = CONCAT('CREATE DATABASE ', @db_name);
PREPARE state FROM @query;
EXECUTE state;
SET @counter = @counter + 1;
END WHILE;
END
//
DELIMITER ;
DROP PROCEDURE IF EXISTS create_privilegies;
DELIMITER //
CREATE PROCEDURE create_privilegies()
BEGIN
SET @counter = 1;
WHILE (@counter <= 14) DO
SET @user_name = CONCAT('''', 'user', @counter, '''', '@''localhos''');
SET @db_name = CONCAT('DB', @counter, '.*');
SET @query = CONCAT('GRANT ALL PRIVILEGES ON ', @db_name, ' TO ', @user_name);
PREPARE state FROM @query;
EXECUTE state;
SET @counter = @counter + 1;
END WHILE;
END
//
DELIMITER ;
DROP USER IF EXISTS 'sa'@'localhos';
CREATE USER 'sa'@'localhos' IDENTIFIED BY 'de_2';
SELECT user, host FROM mysql.user WHERE user = 'sa';
call create_users();
call create_dbs();
call create_privilegies();
SELECT name,CAST((AES_DECRYPT(UNHEX(pass), @key)) AS CHAR(10000) ) as pass
FROM DB.users;