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

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

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


当前回答

创建被删除的用户,如下所示:

mysql> create user 'web2vi';

or

mysql> create user 'web2vi'@'%';

其他回答

对我来说,从DEFINER中删除“是有效果的。 DEFINER = user@localhost

您的视图“view_quotes”可能已经从“web2vi”是有效用户的另一个数据库复制到“web2vi”不是有效用户的数据库。 将“web2vi”用户添加到数据库或更改视图(通常删除DEFINER='web2vi'@'%'部分并执行脚本将完成此操作)

几分钟前我遇到了你同样的问题,我从mysql中删除一个未使用的用户后遇到了这个问题。用户表,但做一个alter视图修复它,这里有一个方便的命令,使它非常简单:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ",
table_name," AS ", view_definition,";") FROM 
information_schema.views WHERE table_schema='databasename'

混合使用mysql命令行(假设*nix,不熟悉windows):

> echo above_query | mysql -uuser -p > alterView.sql
> mysql -uuser -ppass databasename < alterView.sql

注意:该命令在文件上生成和额外的SELECT CONCAT,使mysql -uuser -ppass databasename < alterView。如果不删除它,SQL将失败。

来源:https://dba.stackexchange.com/questions/4129/modify-definer-on-many-views

快速修复工作周围和转储文件:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql

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

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

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'。

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