【问题标题】:Drop a non existing procedure in MySQL删除 MySQL 中不存在的过程
【发布时间】:2013-05-19 12:38:51
【问题描述】:

我在 fedora 上使用 MySQL 5.5.31,但我无法删除不存在的程序。 使用 root 用户:

  • 创建一个新数据库:测试
  • 创建一个新用户:test
  • 将所有权限授予用户 test 以进行数据库测试

    GRANT ALL PRIVILEGES ON test.* TO 'test'@'%' WITH GRANT OPTION;
    
  • 有用户测试

    CREATE PROCEDURE test.foo() SELECT NOW();
    DROP PROCEDURE IF EXISTS test.foo;
    
    Query OK, 0 rows affected (0.00 sec)
    
    DROP PROCEDURE IF EXISTS test.foo;
    
    ERROR 1370 (42000): alter routine command denied to user 'test'@'localhost' for routine 'test.foo'
    

为什么“如果存在”不起作用?

如果我对 root 用户执行相同操作,一切正常(有警告,但没关系):

  • 有用户测试

    CREATE PROCEDURE test.foo() SELECT NOW();
    
    DROP PROCEDURE IF EXISTS test.foo;
    Query OK, 0 rows affected (0.00 sec)
    
    DROP PROCEDURE IF EXISTS test.foo;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    

【问题讨论】:

    标签: mysql sql-drop


    【解决方案1】:

    首先,GRANT ALL PRIVILEGES ON test.* TO 'test'@'%' WITH GRANT OPTION;localhost 连接时不会授予用户权限

    您需要单独授予localhost 的权限

    从错误看来,您在第一个 DROP 之后断开连接并从 localhost 再次连接。

    好吧,如果你一个接一个地执行这 4 个语句,你应该得到与 root 相同的结果

    GRANT ALL PRIVILEGES ON test.* TO 'test'@'%' WITH GRANT OPTION;
    CREATE PROCEDURE test.foo() SELECT NOW();
    DROP PROCEDURE IF EXISTS test.foo; 
    DROP PROCEDURE IF EXISTS test.foo; 
    

    如果我已经明确回答,请告诉我

    【讨论】:

    • 感谢您的回复,我完全错过了部分:您需要单独授予 localhost 的权限
    • 首先,您是否尝试一个接一个地执行这 4 个语句?
    【解决方案2】:

    尝试在DROP PROCEDURE IF EXISTS 之前使用SET sql_notes = 0; 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 2016-03-03
      • 2018-03-01
      相关资源
      最近更新 更多