Удалить пользователя из MySQL не работает

Я пытаюсь удалить пользователя с сервера MySQL:

$conn = new PDO("mysql:host=$host;port=$port;dbname=mysql;charset=utf8","$adminname", "$pass",array( PDO::ATTR_PERSISTENT => true));
$sql_deleteuser="DELETE FROM `mysql`.`user` WHERE `user`.`User` = '$username'";                 
//$sql_deleteuser="SELECT `User` FROM `mysql`.`user`";  
$PDOStatement3=$conn->prepare($sql_deleteuser);
//$PDOStatement3->bindParam(':username', $username, PDO::PARAM_STR);   
$res_exec=$PDOStatement3->execute();

но это не работает и нет ошибки в errorInfo() , я пробовал

$sql_deleteuser="DROP USER '$username'@'%'";

и

$sql_deleteuser="IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'$username') DROP USER [$username]"; тот же результат.

Соединение было в порядке, я проверил его с помощью запроса SELECT, и он работает.

Я что-то пропустил. Любая помощь будет оценена.


person Oumaya    schedule 21.04.2015    source источник
comment
Вам нужны привилегии, чтобы удалить пользователя   -  person Zelldon    schedule 21.04.2015
comment
Да, подключение уже было выполнено с учетной записью администратора   -  person Oumaya    schedule 21.04.2015
comment
вы можете проверить ошибку, установив режим ошибки PDO в exception $conn-›setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); кстати $conn-›exec($sql_deleteuser); тоже должно работать, не нужно готовиться!   -  person Anil    schedule 21.04.2015
comment
sys.database_principal это сервер sql измените теги   -  person Mihai    schedule 21.04.2015
comment
на самом деле это проблема привилегий, так как я получаю Syntax error or access violation , но у меня есть ALL PRIVILEGES для администратора как SuperUser localhost global ALL PRIVILEGES Yes для user таблицы.   -  person Oumaya    schedule 21.04.2015


Ответы (2)


Либо у вас нет привилегий/прав на удаление пользователя

Оператор DROP USER удаляет одну или несколько учетных записей MySQL. Чтобы использовать его, вы должны иметь привилегию DELETE для базы данных mysql.

ИЛИ

возможно, проблема в том, что у пользователя открыто соединение, потому что документ mysql говорит:

Важно

УДАЛИТЬ ПОЛЬЗОВАТЕЛЯ не закрывает автоматически открытые сеансы пользователей. Скорее, в случае удаления пользователя с открытым сеансом оператор не вступит в силу до тех пор, пока сеанс этого пользователя не будет закрыт. После закрытия сеанса пользователь отбрасывается, и следующая попытка пользователя войти в систему будет неудачной. Это по дизайну.

Как убить соединения, см. этот ответ:

как отключить соединения mySQL

См. документ:

https://dev.mysql.com/doc/refman/5.0/en/drop-user.html

person Zelldon    schedule 21.04.2015
comment
Да, это проблема с привилегиями, несмотря на наличие таблицы ALL PRIVILEGES для user пользователь-администратор не может выполнять DELETE или DROP - person Oumaya; 21.04.2015
comment
Вы проверили открытые соединения? - person Zelldon; 21.04.2015
comment
Да, я не открывал никакого соединения с целевой учетной записью пользователя, есть ли способ принудительно закрыть ее? - person Oumaya; 21.04.2015
comment
посмотрите мой пост редактирования, и вы пробовали сбрасывать с пользователем root или использовать только с привилегиями root? если второй, попробуйте с пользователем root. - person Zelldon; 21.04.2015
comment
Да сбросить его с рут юзером, как сделать с моим админом юзером у него такие же привилегии как у рута!!! - person Oumaya; 21.04.2015
comment
В качестве решения я отозвал все привилегии у своего пользователя вместо того, чтобы полностью удалить его, и попросил администратора удалить его вручную позже, если это необходимо. - person Oumaya; 22.04.2015

try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//Edit: Use REVOKE to revoke the privileges. This removes rows for the account from all the grant tables except the user table, and revokes any global privileges listed in the user table.

// sql to delete a record, use $host to remove a specific user
$sql = "DELETE FROM `mysql`.`user` WHERE `user`.`User` = '$username" AND `user`.`Host` = '$host";


// use exec() because no results are returned
$conn->exec($sql);
echo "Record deleted successfully";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}

попробуйте с приведенным выше кодом, вы также обнаружите ошибку!

person Anil    schedule 21.04.2015
comment
Во-первых, вы не экранируете '$username'; во-вторых, вы должны удалить другую учетную запись пользователя, а не ту, которую вы используете для подключения к базе данных. В-третьих, в вашем вызове exec вы не проверяете возвращаемое значение... и просто предполагаете успех. - person Svetoslav Marinov; 24.08.2015