通过JDBC使用View-over-View DDL为“用户拒绝任何命令”

时间:2012-06-26 10:57:12

标签: mysql jdbc view

我在这里有一个非常奇怪的问题。我们使用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在普通表上创建视图也很有效。

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

任何好的想法会导致什么?

PS:我知道创建视图的视图并不是最好的想法,但是暂时假设在这种情况下无法避免。

6 个答案:

答案 0 :(得分:5)

我发现在创建视图之前发布use database statement解决了我的问题。这似乎与MySql错误报告Bug #91122有关,“无法创建包含from子查询的视图(未选择数据库)”

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

答案 1 :(得分:1)

我的问题是由于创建VIEW所致,其中某些列来自目标实例中缺少的另一个数据库。似乎,如果您没有正确的权限,也会出现此“有意义的”错误“任何命令都拒绝给用户...。”

答案 2 :(得分:0)

我认为您的GRANT权限存在缺陷。

使用JDBC远程访问数据库时,您还需要为用户计算机创建授予权限。

你有以下格兰特吗?如果没有尝试授予以下内容:

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

答案 3 :(得分:0)

我在这里遇到了非常相似的问题。 鉴于您已经检查了拨款,请在创建视图之前尝试显式设置正在使用的数据库。

答案 4 :(得分:0)

不幸的是,我们从来没有找到解决方案,所以我们只是采用了一种解决方法,即调用在mysql客户端中执行的外部sql脚本。

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

在这里仅需提及,因为它似乎仍然是一个经常被问到的问题。

答案 5 :(得分:0)

如创建史蒂夫·麦克(Steve Mc)回答的那样,在创建视图之前进行

use database查询是绝对有魅力的。我被困了好几个星期了!