【问题标题】:Error: select command denied to user '<userid>'@'<ip-address>' for table '<table-name>'错误:选择命令拒绝用户 '<userid>'@'<ip-address>' 用于表 '<table-name>'
【发布时间】:2011-06-13 14:46:28
【问题描述】:

在我的网站中,我使用的是 MySQL 数据库。我正在使用一个网络服务,我在其中进行所有与数据库相关的操作。

现在在该网络服务的一种方法中,我收到以下错误。

拒绝用户 ''@'' 表 '' 的选择命令

可能出了什么问题?

以下是我收到该错误的代码。我尝试调试,发现它在该行失败

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();

【问题讨论】:

  • 希望 OP 现在对此进行了排序,但是当我的查询中的字段名称拼写错误时,我遇到了这个错误。这浪费了我一天的 30 分钟!

标签: mysql mysqldatareader mysql-error-1142


【解决方案1】:

【讨论】:

    【解决方案2】:

    数据库用户没有选择查询的权限。

    如果你有 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 + "'";
    

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

    你考虑过这件事吗?

    【讨论】:

      【解决方案3】:

      我确信原始发帖人的问题早已得到解决。但是,我遇到了同样的问题,所以我想我应该解释一下是什么导致了这个问题。

      我正在对两个表进行联合查询——“foo”和“foo_bar”。但是,在我的 SQL 语句中,我有一个错字:'foo.bar'

      因此,错误消息并没有告诉我“foo.bar”表不存在,而是表明该命令被拒绝——就好像我没有权限一样。

      希望这对某人有所帮助。

      【讨论】:

      • 不错的收获!我正在寻找用户许可而不是拼写错误。
      • 在我的例子中(Java Hibernate 应用程序),一个杂散的@Table.catalog 注释覆盖了连接字符串中提供的数据库名称。
      • 这也是我的根本原因,一个错字。从安全的角度来看,给出拒绝访问错误是有意义的,因为如果破解者试图通过尝试各种名称来找出表名,得到“不存在”错误将表明哪些表名实际上存在于他们的哪个点可以应用蛮力找出用户名和密码。根据我的经验,用户名和密码是多么简单(通常
      • 在我的情况下,这是因为一些查询代码(如数据)已从 SQL Server 数据库中复制,而 dbo. 在 MySQL 数据库中不起作用:当 dbo.tablename改成tablename,执行没有错误。
      • 昨天select * from dbo.table 在这里工作,今天只有select * from table 如果我添加dbo 前缀然后访问拒绝:)
      【解决方案4】:

      问题很可能在 .和一个_。在我输入的查询中说

      从 LOCATION.PT 中选择.....

      而不是

      从 LOCATION_PT 选择.....

      所以我认为 MySQL 会将 LOCATION 视为数据库名称并给出访问权限错误。

      【讨论】:

        【解决方案5】:

        与我错过输入查询的其他答案类似。

        我有 -

        SELECT t.id FROM t.table LEFT JOIN table2 AS t2 ON t.id = t2.table_id
        

        应该是

        SELECT t.id FROM table AS t LEFT JOIN table2 AS t2 ON t.id = t2.table_id
        

        Mysql 试图查找用户没有权限的名为 t 的数据库。

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题。这与休眠有关。我在 hibernate.cfg.xml 中将数据库从开发更改为生产,但在其他 hbm.xml 文件中存在具有旧数据库名称的目录属性,这导致了问题。

          它没有告诉错误的数据库名称,而是显示 Permission denied 错误。

          所以请确保在任何地方更改数据库名称或删除目录属性

          【讨论】:

            【解决方案7】:

            我在 Mac 上通过 Sequel Pro 导出数据库时遇到了完全相同的错误消息。我是 root 用户,所以我知道这不是权限。然后我用 mysqldump 试了一下,得到了不同的错误信息: 出现错误:1449:使用 LOCK TABLES 时指定为定义者 ('joey'@'127.0.0.1') 的用户不存在

            啊,我已经从开发站点上的备份中恢复了这个数据库,我还没有在这台机器上创建那个用户。 “将 . 上的所有权限授予由 'joeypass' 标识的 'joey'@'127.0.0.1';”成功了。

            【讨论】:

              【解决方案8】:

              如果您使用的是 Windows 窗体应用程序,这对我有用

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

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

              【讨论】:

                【解决方案9】:

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

                由于我的 mysql 用户权限非常严格,当 hibernate 尝试查询一个表时,它会查询 hibernate.default_schema 数据库中用户没有权限的那个表。

                很遗憾,mysql 没有在此错误消息中正确指定数据库,因为那样会立即清除问题。

                【讨论】:

                • 我在旧应用程序的 XML 映射中将目录属性设置为错误的模式名称 - 不同的风格,但最终是类似的罪魁祸首。感谢您为我指明正确的方向。
                【解决方案10】:

                我遇到了同样的问题。我对此感到非常沮丧。也许这不是在回答问题,但我只是想分享我的错误经验,可能还有其他人和我一样受苦。显然这只是我的低准确率。

                我有这个:

                SELECT t_comment.username,a.email FROM t_comment
                LEFT JOIN (
                    SELECT username,email FROM t_un
                ) a
                ON t_comment.username,a.email
                

                应该是这样的:

                SELECT t_comment.username,a.email FROM t_comment
                LEFT JOIN (
                    SELECT username,email FROM t_un
                ) a
                ON t_comment.username=a.username
                

                然后那天我的问题就解决了,我就为了这个问题,苦苦挣扎了两个小时。

                【讨论】:

                • 与 Pisces22(和我自己)一样,另一个实际上与错误消息 re' 权限无关的问题。 (注意:其他人与您一样难以看到这种差异,因此对其他人来说:在ON 子句中,,a.email 被更正为=a.username
                【解决方案11】:

                选择命令拒绝用户 ''@'' 用于表 ''

                这个问题基本上是在您的连接查询中连接条件错误的数据库名称后产生的。所以请检查数据库后连接表名中的选择查询。

                然后解决它,例如它的正确答案

                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在同一个数据库上,但是在线数据库名称不同,然后在这个问题上报错。

                【讨论】:

                  【解决方案12】:

                  免责声明

                  • 先备份。
                  • 在执行前检查您的查询语句。
                  • 确保在更新之前添加了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 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;
                  

                  Ciao.

                  【讨论】:

                    【解决方案13】:

                    升级到 MySQL Workbench 最新版本 8.0.18 后,我的问题得到了解决

                    【讨论】:

                      【解决方案14】:

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

                      我从 SQL 查询中删除了数据库名称,它得到了修复。

                      【讨论】:

                      • 补充一点,当我们从 DB 工具生成 SQL 时,它可能会在查询中添加数据库名称。请考虑对生成的 SQL 进行审查,因为它不适用于远程计算机,因为数据库名称可能会有所不同。
                      【解决方案15】:

                      再次尝试授予权限。

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

                      【讨论】:

                        【解决方案16】:

                        我确定这已经解决了,只是想指出我在数据库名称中有一个拼写错误,它仍然在表名称上抛出这个错误。因此,在这种情况下,您可能需要检查拼写错误。

                        【讨论】:

                          猜你喜欢
                          • 2019-11-07
                          • 2015-04-08
                          • 2013-08-07
                          • 1970-01-01
                          • 2013-01-03
                          • 2016-12-03
                          • 2012-06-12
                          • 1970-01-01
                          相关资源
                          最近更新 更多