错误:用户'<userid>'@'<ip-address>'对表'<table-name>'的选择命令被拒绝。

74
在我的网站中,我使用MySQL数据库。我使用一个Web服务,在其中进行所有与数据库相关的操作。现在,在该Web服务的某个方法中,我遇到了以下错误:
select command denied to user '<userid>'@'<ip-address>' for table '<table-name>'
可能出了什么问题?以下是我遇到错误的代码段。我尝试调试并发现它在这一行失败:
MySqlDataReader result1 = command1.ExecuteReader();下面是我的代码:
        String addSQL = "Select Max(`TradeID`) from `jsontest`.`tbl_Positions";
        MySqlConnection objMyCon = new MySqlConnection(strProvider);
        objMyCon.Open();
        MySqlCommand command = objMyCon.CreateCommand();

        command.CommandText = addSQL;
         MySqlDataReader result = command.ExecuteReader();
        //int j = command.ExecuteNonQuery();
         while (result.Read())
         {
             MaxTradeID = Convert.ToInt32(result[0]);
         }
        objMyCon.Close();
        for (i = 1; i <= MaxTradeID; i++)
        {
            String newSQL = "Select `Strike`,`LongShort`,`Current`,`TPLevel`,`SLLevel` from `json`.`tbl_Position` where `TradeID` = '" + i + "'";
            MySqlConnection objMyCon1 = new MySqlConnection(strProvider);
            objMyCon1.Open();
            MySqlCommand command1 = objMyCon1.CreateCommand();

            command1.CommandText = newSQL;
            MySqlDataReader result1 = command1.ExecuteReader();
           objMyCon2.Close();
17个回答

199

我相信原帖的问题早已解决。但是,我也曾遇到同样的问题,所以我想解释一下导致我遇到这个问题的原因。

我在使用联合查询时涉及两个表 - 'foo' 和 'foo_bar'。然而,在我的SQL语句中,我错拼了 'foo.bar'。

由此,错误信息并未告诉我 'foo.bar' 表不存在,而是表明命令被拒绝,就好像我没有权限一样。


1
在我的情况下(Java Hibernate 应用程序),一个无意义的 @Table.catalog 注释覆盖了连接字符串中提供的数据库名称。 - Alex R
2
这也是我的根本原因,一个打字错误。从安全角度来看,给出访问被拒绝的错误信息是有意义的,因为如果黑客试图通过尝试各种名称来找出表名,得到“不存在”错误将指示哪些表名实际上存在,此时他们可以应用暴力破解来找出用户名和密码。根据我的经验,用户名和密码通常很简单(通常是<10个连接的词典单词),所以这可能不会花费太长时间... - Kurt Wagner
4
我的情况是因为一些查询代码(如数据)从SQL Server数据库中复制而来,在MySQL数据库中dbo.无法正常工作:当 dbo.tablename 被更改为 tablename 时,代码可以正确执行。 - Doug_Ivison
1
昨天同样的代码 select * from dbo.table 可以运行,但今天只有去掉 dbo 前缀才能运行 select * from table ,如果加上 dbo 前缀则会出现访问拒绝的错误。 - SüniÚr
我被逼疯了,问题是我改变了通过连接所引用的外部数据库的名称。错误的错误信息!已修复!谢谢。 - fede72bari
显示剩余6条评论

32

数据库用户没有执行select查询的权限。

如果您拥有MySQL的root访问权限,可以将权限授予用户。

http://dev.mysql.com/doc/refman/5.1/en/grant.html

您的第二个查询在不同的数据库和不同的表中。

 String newSQL = "Select `Strike`,`LongShort`,`Current`,`TPLevel`,`SLLevel` from `json`.`tbl_Position` where `TradeID` = '" + i + "'";

而且您正在连接的用户没有访问此数据库或特定表中数据的权限。

您考虑过这件事吗?


11

这个问题发生在我身上,因为我将hibernate.default_schema设置为与DataSource不同的数据库。

由于我的 mysql 用户权限很严格,当 hibernate 尝试查询一张表时,它会查询位于hibernate.default_schema数据库中的表,而该用户没有访问权限。

不幸的是,mysql 在这个错误信息中没有正确指定数据库,否则这个问题将很快解决。


1
我在一个旧应用程序的XML映射中,将目录属性设置为错误的架构名称 - 不同的风味,但最终是相似的罪魁祸首。感谢您指引我走向了正确的方向。 - Giulio Piancastelli

10

选择命令被拒绝,用户''@''无法访问表''

这个问题基本上是由于连接条件中join查询的数据库名有误导致的。请检查join表名后面的数据库名称,以解决此问题。

例如,正确的解决方法是:

string g = " SELECT `emptable`.`image` , `applyleave`.`id` , `applyleave`.`empid` , `applyleave`.`empname` , `applyleave`.`dateapply` , `applyleave`.`leavename` , `applyleave`.`fromdate` , `applyleave`.`todate` , `applyleave`.`resion` , `applyleave`.`contact` , `applyleave`.`leavestatus` , `applyleave`.`username` , `applyleave`.`noday` FROM `DataEMP_ems`.`applyleave` INNER JOIN `DataEMP_ems`.`emptable` ON ( `applyleave`.`empid` = `emptable`.`empid` ) WHERE ( `applyleave`.`leavestatus` = 'panding' ) ";

连接表是在同一个数据库上的imputableapplyleave,但在线数据库名称与此问题给出的错误不同。


3

如果您正在从Windows表单应用程序中工作,这对我有用

"server=localhost; user id=dbuser; password=password; database=dbname; Use Procedure Bodies=false;"

只需在连接字符串末尾添加"Use Procedure Bodies=false"即可。


3
我在使用Mac上的Sequel Pro进行数据库导出时,遇到了完全相同的错误消息。我是root用户,所以我知道这不是权限问题。然后我尝试使用mysqldump,并得到了另一条错误消息:Got error: 1449:当使用LOCK TABLES时,指定的定义者用户('joey'@ '127.0.0.1')不存在

啊哈,我从开发站点的备份中恢复了此数据库,并且我没有在这台机器上创建该用户。"grant all on . to 'joey'@'127.0.0.1' identified by 'joeypass';"就解决了问题。

希望对您有所帮助。


2

免责声明

  • 首先备份。
  • 在执行之前检查您的查询语句。
  • 确保在更新之前添加了WHERE(筛选)子句。

如果您具有root访问权限或足够的特权,则可以直接执行以下操作:

以root身份登录到您的MySQL中,

$ mysql -u root -p

显示数据库;

mysql>SHOW DATABASES;

选择MySQL数据库,这是所有权限信息所在的地方

mysql>USE mysql;

展示数据表。

mysql>SHOW TABLES;

您的情况涉及到的特权表是“db”,让我们看看它有哪些列:
mysql>DESC db;

为了列出用户的权限,请输入以下命令,例如:
mysql>SELECT user, host, db, Select_priv, Insert_priv, Update_priv, Delete_priv FROM db ORDER BY user, db;

如果您找不到该用户,或者在Select_priv列中看到该用户有一个“N”,则必须相应地进行INSERT或UPDATE操作:
INSERT:
INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv) VALUES ('localhost','DBname','UserName','Y' ,'N','N','N');

更新:

UPDATE db SET Select_priv = 'Y' WHERE User = 'UserName' AND Db = 'DBname' AND Host='localhost';

最后,输入以下命令:

mysql>FLUSH PRIVILEGES;

你好。

2

对我来说,我在SQL查询中不小心包含了本地数据库名称,因此当我部署时出现了访问被拒绝的问题。

我从SQL查询中删除了数据库名称,问题得到了解决。


此外,当我们从数据库工具生成SQL时,有可能会将数据库名称添加到查询中。请考虑对生成的SQL进行审核,因为它在远程机器上可能无法正常工作,因为数据库名称可能会有所不同。 - sajin tm

2

请尝试重新授予权限。

GRANT ALL PRIVILEGES ON the_database.* TO 'the_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接