【问题标题】:Drop user from MySQL doesn't work从 MySQL 中删除用户不起作用
【发布时间】:2015-04-21 10:49:29
【问题描述】:

我正在尝试从 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 查询对其进行了测试,它可以正常工作。

我是不是错过了什么。任何帮助将不胜感激。

【问题讨论】:

  • 您需要权限才能删除用户
  • 是的,我已经使用管理员帐户建立了连接
  • 您可以通过将PDO错误模式设置为异常来检查错误 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);顺便说一下 $conn->exec($sql_deleteuser);应该也行,不用准备!
  • sys.database_principal 这是 sql server 更改你的标签
  • 事实上这是一个特权问题,因为我得到了 Syntax error or access violation ,但我有 ALL PRIVILEGES 管理员作为 SuperUser localhost global ALL PRIVILEGES Yes user 表。

标签: php mysql sql-delete


【解决方案1】:

要么您没有删除用户的特权/权利

DROP USER 语句删除一个或多个 MySQL 帐户。 要使用它,您必须拥有mysql数据库的DELETE权限

也许问题是用户有一个打开的连接 因为 mysql 文档说:

重要

DROP USER 不会自动关闭任何打开的用户 会议。相反,如果具有打开会话的用户是 删除,该语句在该用户的会话之前不会生效 已经关闭。会话关闭后,用户将被删除,并且 用户的下一次登录尝试将失败。这是设计使然。

如何终止连接请参阅此答案:

how to kill mySQL connections

参见文档:

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

【讨论】:

  • 是的,这是权限问题,尽管有user 表的ALL PRIVILEGES 用户管理员无法执行DELETEDROP
  • 你检查打开的连接了吗?
  • 是的,我没有打开与用户目标帐户的任何连接,有没有办法强制关闭它?
  • 查看我的编辑帖子,您是否尝试过使用 root 用户删除或仅使用类似 root 的权限?如果第二次尝试使用 root 用户。
  • 作为解决方案,我撤销了用户的所有权限,而不是完全删除它,并告诉管理员稍后在需要时手动删除它。
【解决方案2】:
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();
}

试试上面的代码,你也会发现错误!

【讨论】:

  • 首先,你没有转义'$username';其次,您应该删除另一个用户帐户,而不是您用来连接数据库的用户帐户。第三,在您的 exec 调用中,您没有检查返回值......只是假设成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2017-03-10
  • 2013-10-31
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
相关资源
最近更新 更多