使用JDBC进行View-over-View DDL时,出现“用户被拒绝任何命令”的错误提示。

7

我这里遇到了一个相当奇怪的问题。我们正在使用Pentaho Kettle来管理数据库模式(该模式又使用MySQL JDBC mysql-connector-java-5.1.17.jar)。在尝试创建一个包含另一个视图(在这种情况下是接口)的视图时,我们遇到了以下错误:

2012/06/26 11:46:55 - SQL2 - ERROR : Couldn't execute SQL: CREATE OR REPLACE VIEW `test_delete2` as select  * from interfaces
2012/06/26 11:46:55 - SQL2 - ERROR : ANY command denied to user 'ncim'@'xxx.xxx.xxx..xx' for table '/var/mysql/mysql2018/tmp/#sql_4e67_0'

然而,使用相同的语句和用户,但通过mysql命令行客户端进行操作,则如预期那样工作。此外,使用JDBC在普通表上创建视图也是有效的。

这是在服务器端运行的MariaDB 5.2.10和Solaris 10,但我们在Oracle MySQL上也遇到了同样的问题。

有什么好的想法可以解决这个问题吗?

PS:我知道在视图上创建视图并不是一个好主意,但暂时假设在本例中无法避免此情况。


尝试使用JDBC运行SHOW GRANTS。结果是什么? - Devart
我不确定这是否有好处,它应该显示与不使用JDBC时不同的内容(在那里用户明确拥有权限),但是谁知道呢,我会尝试一下。可能需要几天时间,直到我下次访问此环境。 - C. Ramseyer
将 SHOW GRANTS 的结果添加到问题中。 - vivek_jonam
你解决过这个问题吗?我在使用 Mysqli 和 PHP 创建一个视图时遇到了同样的问题。对我来说这很有意义。 - Andras Gyomrey
很抱歉告诉你,我们只是通过调用mysql命令行客户端来解决了这个问题。 - C. Ramseyer
6个回答

8

我发现在创建视图之前发出 use database 语句 解决了我的问题。这似乎与 MySql 的一个 bug 报告 Bug #91122 "Failed to create a view containing a from subquery(No selected database)" 有关。

基本上,如果您尝试使用 dbname.view_name 语法创建视图,则可能会出现错误。但是,如果您事先发出 use database 语句,那么一切都会顺利进行。


4
太好了,也许经过八年后这个谜团终于解开了!虽然我不能再尝试一次,但我愿意接受这个答案。谢谢! - C. Ramseyer
1
我可以确认,我刚刚遇到了这个错误(确切地说是在2020年8月),并且通过在RDS Amazon Aurora MySQL 5.7上运行此解决方法成功解决了它。非常感谢。 - spen.smith
1
可以确认使用C++连接器的Mysql版本为8.0.23。 - Elysiumplain

2

我这里也遇到了非常类似的问题。既然你已经检查过授权,尝试在创建视图之前明确设置使用的数据库。


2

我的问题是由于创建视图时,其中一些列来自另一个数据库,而该数据库在目标实例上缺失。如果您没有正确的权限,也会出现这个“有意义”的错误:“用户...被拒绝执行任何命令”。


2
来自审查:嗨,这篇文章似乎没有提供一个优质答案给问题。请编辑您的答案并改进它,或者只将其作为评论发布。 - sɐunıɔןɐqɐp

1

很遗憾,我们从未找到解决方案,所以我们只能采用绕过方式,调用在mysql客户端中执行的外部sql脚本。

不确定当前的Mysql是否仍存在此问题,与此同时,我们已迁移到另一个数据库,而且我也不再在这个团队工作了。

之所以在这里提及这个问题,是因为它似乎仍然是一个经常被查看的问题。


1
在创建视图之前执行use database查询,正如Steve Mc所回答的那样,效果非常好。我被这个问题困扰了几周!

在正确的答案下添加评论,而不是添加答案。 - Syed Sajid
1
抱歉并感谢您的提示,但在我能够评论之前,我需要拥有50点声望。 - curiousez

0

我认为你的GRANT权限存在问题。

当使用JDBC远程访问数据库时,你还需要为用户机器创建Grant权限。

你是否有以下这样的GRANT?如果没有,请尝试按照以下方式授权:

grant all on <database>.* to< username >’@'%' identified by '< passwd >';

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