MySQL错误1449:指定为定义者的用户不存在

Tec*_*MLG 320 mysql permissions

当我运行以下查询时,我收到一个错误:

SELECT
  `a`.`sl_id`                     AS `sl_id`,
  `a`.`quote_id`                  AS `quote_id`,
  `a`.`sl_date`                   AS `sl_date`,
  `a`.`sl_type`                   AS `sl_type`,
  `a`.`sl_status`                 AS `sl_status`,
  `b`.`client_id`                 AS `client_id`,
  `b`.`business`                  AS `business`,
  `b`.`affaire_type`              AS `affaire_type`,
  `b`.`quotation_date`            AS `quotation_date`,
  `b`.`total_sale_price_with_tax` AS `total_sale_price_with_tax`,
  `b`.`STATUS`                    AS `status`,
  `b`.`customer_name`             AS `customer_name`
FROM `tbl_supplier_list` `a`
  LEFT JOIN `view_quotes` `b`
    ON (`b`.`quote_id` = `a`.`quote_id`)
LIMIT 0, 30
Run Code Online (Sandbox Code Playgroud)

错误消息是:

#1449 - The user specified as a definer ('web2vi'@'%') does not exist
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这个错误?我如何解决它?

Cho*_*roc 479

将视图/触发器/过程从一个数据库或服务器导出到另一个数据库或服务器时,通常会发生这种情况,因为创建该对象

您有两种选择:

1.更换DEFINER

在最初导入数据库对象时,通过DEFINER从转储中删除任何语句,这可能是最容易的.

稍后更改定义者是一个更棘手的问题:

如何更改视图的定义器

  1. 运行此SQL以生成必要的ALTER语句

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 复制并运行ALTER语句

如何更改存储过程的定义程序

例:

UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
Run Code Online (Sandbox Code Playgroud)

要小心,因为这将更改所有数据库的所有定义器.

2.创建缺少的用户

如果您在使用MySQL数据库时发现以下错误:

The user specified as a definer ('someuser'@'%') does not exist`
Run Code Online (Sandbox Code Playgroud)

然后你可以使用以下方法解决它:

GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

来自http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

这就像一个魅力 - 你只需要改变someuser失踪用户的名字.在本地开发服务器上,您通常可以使用root.

还要考虑您是否确实需要授予用户ALL权限,或者是否可以使用更少的权限.

  • 正如@Otheus 所提到的,答案是不完整的。DEFINER 不仅可以成为视图和例程的一部分,还可以成为事件和触发器的一部分。要查看缺少的定义器的使用位置,您可以使用以下查询:`SELECT DEFINER,'events' FROM INFORMATION_SCHEMA.EVENTS union SELECT DEFINER,'routines' FROM INFORMATION_SCHEMA.ROUTINES union SELECT DEFINER,'triggers' FROM INFORMATION_SCHEMA.TRIGGERS union SELECT DEFINER ,来自 INFORMATION_SCHEMA.VIEWS 的“视图”;` (7认同)
  • 我认为添加无意义的用户更容易,因为下次执行 dbdump 并导入它时,您将不需要再次进行视图/过程编辑 (3认同)

小智 136

最初创建SQL视图或过程的用户已被删除.如果您重新创建该用户,则应该解决您的错误.

  • 你也可以改变现有用户的定义者:`UPDATE mysql.proc SET definer ='my_new_user @ localhost'WHERE db ='mydatatbase';` (37认同)
  • 谢谢,这很有帮助.通常,在使用mysqldump进行迁移或部署时,创建VIEW,TRIGGER或PROCEDURE(定义者)的用户在目标系统上可能不同.在这种情况下,只需使用目标系统上的有效用户重新创建过程,触发器或视图(`DROP`然后重新'CREATE`)即可. (5认同)
  • 此外,您还需要为添加的用户授予至少"SELECT"和"EXECUTE"权限.当我将数据库备份从一个服务器导出到另一个服务器时,我遇到了这个问题服务器上不存在创建例程的用户. (3认同)

art*_*dev 50

更新mysql后我得到了同样的错误.

此命令后错误已得到修复:

mysql_upgrade -u root
Run Code Online (Sandbox Code Playgroud)

每次升级MySQL时都应该执行mysql_upgrade.它检查所有数据库中的所有表是否与当前版本的MySQL Server不兼容.如果发现某个表可能存在不兼容性,则会进行检查.如果发现任何问题,表格将被修复.mysql_upgrade还会升级系统表,以便您可以利用可能已添加的新特权或功能.


Bro*_*dge 35

如果用户存在,则:

mysql> flush privileges;
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 31

像这样创建已删除的用户:

mysql> create user 'web2vi';
Run Code Online (Sandbox Code Playgroud)

要么

mysql> create user 'web2vi'@'%';
Run Code Online (Sandbox Code Playgroud)

  • 创建丢失的用户之后,遇到另一个错误:错误1142(42000):向表'foo'的用户'web2vi'@'%'的TRIGGER命令被拒绝,应将此命令`grant all on *。*添加到'web2vi创建用户后,由“`”标识的'@'%' (2认同)

Hus*_*imi 27

跟着这些步骤:

  1. 转到PHPMyAdmin
  2. 选择您的数据库
  3. 选择你的桌子
  4. 在顶部菜单上单击"触发器"
  5. 单击"编辑"以编辑触发器
  6. 将definer从[user @ localhost]更改为root @ localhost

希望能帮助到你

  • 这是问题的实际解决方案,而不是创建用户并授予权限。只需更改定义器。 (2认同)
  • 查找所有触发器:显示触发器 (2认同)

Muh*_*eem 20

解决方案只是单行查询,如下所示:

grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;
Run Code Online (Sandbox Code Playgroud)

替换ROOT为您的mysql用户名.替换PASSWORD为您的mysql密码.

  • 注意:MySQL 用户区分大小写。 (3认同)

小智 13

对于未来的googlers:我收到了类似的消息,试图更新一个没有视图的数据库中的表.经过一番挖掘,结果发现我在该表上导入了触发器,这些是由不存在的用户定义的东西.删除触发器解决了问题.

  • 触发器是问题所在,我更新了触发器部分中的定义器。没有更多问题了。 (2认同)

Sel*_*ani 12

通过运行以下注释修复.

grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

如果你得到some_other而不是web2vi那么你必须相应地改变名称.


cos*_*ers 7

您的mysql服务器上不存在用户'web2vi'.

请参阅http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user

如果该用户确实存在,请检查它可以访问哪些服务器,虽然我认为这将是一个不同的错误(EG您可能有web2vi @ localhost,但您正在访问数据库为web2vi @%(在任何地方)


Dev*_*per 7

快速解决方法解决并转储文件:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用。定义器包含在转储中。 (2认同)

小智 7

将数据库从一台服务器移到另一台服务器后,这发生在我身上。最初,定义器使用的是localhost和用户。在新服务器上,我们没有该用户,并且主机也已更改。我备份了该特定表,并从phpmyadmin中手动删除了所有触发器。之后,它对我来说一直很好。


c-t*_*sca 6

我遇到了与root用户相同的问题,当我更换时,它对我有用

root@%
Run Code Online (Sandbox Code Playgroud)

通过

root@localhost
Run Code Online (Sandbox Code Playgroud)

因此,如果允许用户'web2vi'从'localhost'连接,您可以尝试:

web2vi@localhost
Run Code Online (Sandbox Code Playgroud)

我已远程连接到数据库.


mes*_*kin 6

grant all on *.* to 'username'@'%' identified by 'password' with grant option;
Run Code Online (Sandbox Code Playgroud)

例:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
Run Code Online (Sandbox Code Playgroud)


kiv*_*ant 5

为什么我会收到那个错误?我如何解决它?

我花了一个小时才找到解决此类问题的决定。但是,就我而言,我运行了这个:

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2;
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist
Run Code Online (Sandbox Code Playgroud)

如果你真的想找到问题所在,只需一一运行这些命令:

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';
Run Code Online (Sandbox Code Playgroud)

...并且,在每个之后,查找字段“定义器”。

在我的情况下,它是有胡子的旧触发器,开发人员忘记删除了。