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

时间:2011-01-22 09:13:33

标签: mysql mysqldatareader mysql-error-1142

在我的网站上,我使用的是MySQL数据库。我正在使用web服务,在那里进行所有与数据库相关的操作。

现在在该webservice的一个方法中,我得到以下错误。

  

为表''

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

可能出现什么问题?

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

行失败了

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

16 个答案:

答案 0 :(得分:139)

我确信原始海报的问题早已得到解决。但是,我有同样的问题,所以我想我会解释导致这个问题的原因。

我正在用两个表进行联合查询 - 'foo'和'foo_bar'。但是,在我的SQL语句中,我有一个拼写错误:'foo.bar'

所以,不是告诉我'foo.bar'表不存在,而是错误消息表明命令被拒绝 - 好像我没有权限。

希望这有助于某人。

答案 1 :(得分:26)

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

如果您具有对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 + "'";

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

你有没有考虑过这件事?

答案 2 :(得分:7)

  

选择拒绝用户的命令&#39;&#39; @&#39;&#39;对于表格&#39;

此问题基本上是在连接条件为连接查询中的数据库名称错误后生成的。因此,请在数据库后检查连接表名称中的选择查询。

然后解决它,例如正确的ans ware

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 :(得分:6)

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

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

不幸的是,mysql没有在此错误消息中正确指定数据库,因为这样可以立即清除。

答案 4 :(得分:3)

答案 5 :(得分:2)

我在Mac上通过Sequel Pro进行数据库导出时出现了完全相同的错误消息。我是root用户,所以我知道它不是权限。然后我尝试使用mysqldump并得到一个不同的错误消息:  收到错误:1449:使用LOCK TABLES时,指定为定义者的用户(&#39; joey&#39; @&#39; 127.0.0.1&#39;)

啊,我已经从开发站点上的备份恢复了这个数据库,我还没有在这台机器上创建该用户。 &#34;将全部授予&#39; joey&#39; @&#39; 127.0.0.1&#39;由&#39; joeypass&#39;; &#34;做了伎俩。

HTH

答案 6 :(得分:2)

如果您使用的是Windows窗体应用程序,这对我有用 &#34;服务器=本地主机; user id = dbuser;密码=密码;数据库= dbname;开发使用Procedure Bodies = false;&#34;

只需添加&#34;使用过程Bodies = false&#34;在你的连接字符串的末尾。

答案 7 :(得分:2)

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

我从SQL查询中删除了数据库名称,并对其进行了修复。

答案 8 :(得分:1)

问题很可能是在a之间。和_。在我的查询中说我放

SELECT ..... FROM LOCATION.PT

而不是

SELECT ..... FROM LOCATION_PT

所以我认为MySQL会认为LOCATION是一个数据库名称并且给出了访问权限错误。

答案 9 :(得分:1)

我遇到了同样的问题。这与hibernate有关。我在hibernate.cfg.xml中将数据库从dev更改为production,但是在其他hbm.xml文件中存在具有旧数据库名称的catalog属性,这导致了问题。

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

因此,请确保在任何地方更改数据库名称,或者只删除目录属性

答案 10 :(得分:1)

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

答案 11 :(得分:0)

我遇到了同样的问题。我很沮丧。也许这不是回答这个问题,但我只想分享我的错误经验,可能还有其他人像我一样受苦。显然这只是我的低精度。

我有这个:

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

然后我的问题在那天解决了,我在两个小时内一直在努力,只是因为这个问题。

答案 12 :(得分:0)

派对有点迟了但是,如果你有root访问权限,你可以直接执行以下操作:

以root用户身份登录mysql,

$ mysql -u root -p

显示数据库;

mysql>SHOW DATABASES;

选择mysql数据库,这是所有权限信息所在的位置

mysql>USE mysql;

显示表格。

mysql>SHOW TABLES;

有关您案件特权的表格是&#39; db&#39;,所以让我们看看它有哪些列:

mysql>DESC db;

要列出用户权限,请键入以下命令,例如:

mysql>SELECT user, host, db, Select_priv, Insert_priv, Update_priv, Delete_priv FROM db ORDER BY user, db;

如果您无法找到该用户,或者您发现该用户有“N&#39; N&#39;在Select_priv列中,您必须相应地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;

答案 13 :(得分:0)

再次尝试授予特权。

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

答案 14 :(得分:0)

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

答案 15 :(得分:-1)

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

我有 -

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的数据库,用户没有权限。