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

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

错误信息是:

#1449 - The user specified as a definer ('web2vi'@'%') does not exist

为什么会出现这个错误?我该怎么解决呢?


当前回答

一个或几个视图是由另一个用户创建/注册的。你必须检查视图的所有者,并:

重新创建用户;正如其他答案所说。 或 重新创建用户'web2vi'使用ALTER VIEW创建的视图

我曾经遇到过这个问题。

我试图迁移视图,从BD1到BD2,使用SQLYog。SQLYog在另一个数据库(DB2)中重新创建了视图,但它保留了BD1的用户(它们是不同的)。后来我意识到,我在查询中使用的视图与您的错误相同,即使我没有创建任何视图。

希望这对你有所帮助。

其他回答

遵循以下步骤:

进入PHPMyAdmin 选择数据库 选择您的表格 在顶部菜单中点击“触发器” 点击“编辑”编辑触发器 将定义器从[user@localhost]更改为root@localhost

希望能有所帮助

如果这是一个存储过程,你可以这样做:

UPDATE `mysql`.`proc` SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'

但这是不建议的。

对我来说,更好的解决方案是创建定义器:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';

一个或几个视图是由另一个用户创建/注册的。你必须检查视图的所有者,并:

重新创建用户;正如其他答案所说。 或 重新创建用户'web2vi'使用ALTER VIEW创建的视图

我曾经遇到过这个问题。

我试图迁移视图,从BD1到BD2,使用SQLYog。SQLYog在另一个数据库(DB2)中重新创建了视图,但它保留了BD1的用户(它们是不同的)。后来我意识到,我在查询中使用的视图与您的错误相同,即使我没有创建任何视图。

希望这对你有所帮助。

在我的例子中,我在那个表上有一个触发器,我不能更新数据得到相同的错误。

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

解决方案是删除该表上的触发器并重新创建它们,这解决了问题,因为触发器是由来自另一个服务器的另一个用户创建的,并且在更改托管公司后,用户名在新服务器上更改了。这是我的意见

为什么会出现这个错误?我该怎么解决呢?

我花了一个小时才对这样的问题做出决定。但是,在我的例子中,我运行了这个:

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

如果你真的想找到问题,只需要逐个运行这些命令:

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

...然后,在每个字段之后,查找字段'definer'。

在我的例子中,它是一个老旧的触发器,某个开发人员忘记删除了。