【问题标题】:"ANY Command denied for user" with View-over-View DDL via JDBC通过 JDBC 使用 View-over-View DDL 的“用户拒绝任何命令”
【发布时间】:2012-06-27 16:23:27
【问题描述】:

我在这里遇到了一个非常奇怪的问题。我们使用 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:我知道在视图上创建视图并不是最好的主意,但暂时假设在这种情况下无法避免。

【问题讨论】:

  • 尝试使用 JDBC 运行 SHOW GRANTS。结果如何?
  • 我不确定这是否比不使用 JDBC 时显示其他内容有什么好处(并且用户确实拥有权限),但谁知道呢,我会试一试.不过可能需要几天的时间才能让我下次可以访问此环境。
  • 将 SHOW GRANTS 的结果添加到问题中。
  • 你解决过这个问题吗?我在 php 中使用其他视图创建视图时遇到了与 Mysqli 相同的问题。这对我来说很有意义。
  • 抱歉没有好消息,我们刚刚通过调用 mysql 命令行客户端解决了这个问题。

标签: mysql jdbc view


【解决方案1】:

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

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

【讨论】:

  • 太棒了,也许八年后谜团就解开了!我真的不能再尝试了,但我愿意接受这个作为答案。谢谢!
  • 我可以确认我刚刚遇到了这个错误(字面意思是 2020 年 8 月),并且修复了它,在 RDS Amazon Aurora MySQL 5.7 中运行。非常感谢。
  • 还可以用C++连接器确认Mysql 8.0.23版本。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我的问题是由于创建了 VIEW,其中一些列来自另一个数据库,而目标实例上缺少该数据库。似乎如果您没有正确的权限,也会出现这个“有意义的”错误“ANY command denied to user ....”

    【讨论】:

    • 点评来源: 嗨,这篇文章似乎没有为问题提供quality answer。请编辑您的答案并改进它,或者将其作为评论发布。
    【解决方案4】:

    不幸的是,我们从未找到解决此问题的方法,因此我们只是采用了调用在 mysql 客户端中执行的外部 sql 脚本的解决方法。

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

    在此仅提及这一点,因为它似乎仍然是一个经常被查看的问题。

    【讨论】:

      【解决方案5】:

      use database 在创建视图之前查询绝对魅力,正如 Steve Mc 所回答的那样。我被困了好几个星期!

      【讨论】:

      • 对正确答案添加评论,而不是在此处添加答案。
      • 道歉并感谢您的提示,但我需要获得 50 声望才能发表评论。
      【解决方案6】:

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

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

      您有如下的 GRANT 吗?如果不尝试授予如下:

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

      【讨论】:

        猜你喜欢
        • 2012-01-08
        • 1970-01-01
        • 2012-04-10
        • 2017-08-20
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多