Вы можете использовать этот обходной путь, создав API базы данных. Код SQL должен помочь вам.
CREATE TABLE mysql.`created_users` (
`user_name` varchar(255) DEFAULT NULL,
`owner` varchar(255) DEFAULT NULL
)
В таблице хранятся имена пользователей и то, какой пользователь их создал. Примечание: создайте Процедуры с вашей учетной записью root.
Процедура создания пользователя mysql.
DROP PROCEDURE IF EXISTS mysql.createUser;
DELIMITER //
CREATE PROCEDURE mysql.createUser(IN userName VARCHAR(255), IN userPassword VARCHAR(255))
BEGIN
SET @createUserQuery = CONCAT('
CREATE USER "',userName,'"@"localhost" IDENTIFIED BY "',userPassword,'" '
);
PREPARE stmt FROM @createUserQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @createcreatedUserQuery = CONCAT('
INSERT INTO mysql.created_users (user_name, owner) VALUE("',userName,'", "',USER(),'")'
);
PREPARE stmt FROM @createcreatedUserQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
Процедура удаления и проверки таблицы created_users, чтобы убедиться, что пользователь существует, и удалить правильную проверку.
DROP PROCEDURE IF EXISTS mysql.dropUser;
DELIMITER //
CREATE PROCEDURE mysql.dropUser(IN userName VARCHAR(255))
BEGIN
SET @canDeleteUser = 0;
SET @createCountUserQuery = CONCAT('
SELECT COUNT(*) FROM mysql.created_users WHERE user_name = "',userName,'" AND owner = "',USER(),'" INTO @canDeleteUser'
);
PREPARE stmt FROM @createCountUserQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF @canDeleteUser = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'The user is not known on the server or you dont have rights to delete this user';
END IF;
IF @canDeleteUser = 1 THEN
SET @createDropUserQuery = CONCAT('
DROP USER "',userName,'"@"localhost"'
);
PREPARE stmt FROM @createDropUserQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @createDeleteUserQuery = CONCAT('
DELETE FROM created_users WHERE user_name = "',userName,'" AND owner = "',USER(),'"'
);
PREPARE stmt FROM @createDeleteUserQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END //
DELIMITER ;
И дать права на выполнение этих
GRANT EXECUTE ON PROCEDURE mysql.createUser TO '[user]'@'localhost';
GRANT EXECUTE ON PROCEDURE mysql.dropUser TO '[user]'@'localhost';
И вы можете захотеть предоставить пользователю select priv в mysql.proc, чтобы он мог видеть исходный код процедур и знать параметры.
Вы можете использовать API базы данных следующим образом.
CALL mysql.createUser('user', 'password');
CALL mysql.dropUser('user');
Обратите внимание, что учетная запись root может удалять только пользователей с mysql.dropUser, у которых есть владелец root@localhost
person
Raymond Nijland
schedule
21.08.2015
DROP USER 'rdsadmin'@'localhost'
, вы получите сообщение об ошибке:ERROR 1396 (HY000): Operation DROP USER failed for 'rdsadmin'@'localhost'
. Мне интересно, как это реализовать. - person user3752700   schedule 21.08.2015DELETE FROM USER ...
sql но не дляDROP USER
. Вы знаете причину, или есть способ исправить это? - person user3752700   schedule 22.08.2015foo
, создать таблицуuser
точно такую же, как база данных mysql. Затем создайте триггер с именем mytrigger в таблицеuser
с помощьюCREATE TRIGGER mytrigger ....
. Вы можете найти файл mytrigger.TRG в каталоге foo каталога данных mysql. скопируйте файл TRG в каталог mysql. Триггер будет установлен в базу данных mysql после перезапуска Mysql. Проблема в том, чтоDROP USER ...
не запускает триггер. - person user3752700   schedule 25.08.2015