0

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

  • 创建一个新的数据库:test
  • 创建一个新用户: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)
    
4

2 回答 2

0

首先,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; 

让我知道,如果我已经明确回答

于 2013-05-19T12:48:41.637 回答
0

尝试使用SET sql_notes = 0;beforeDROP PROCEDURE IF EXISTS命令。

于 2018-05-25T06:39:17.627 回答