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

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 Workbench 6.3 Community在Windows 10上导入转储文件后,提示“root@%不存在”。即使用户存在。 首先,我试图注释掉DEFINER,但是,这没有工作。 然后,我用“root@localhost”替换了“root@%”上的字符串,并重新导入转储。这招对我很管用。

其他回答

数据库用户似乎也是区分大小写的,所以虽然我有一个root'@'%用户,但我没有root'@'%用户。我通过工作台将用户更改为大写,问题解决了!

从MySQL参考CREATE VIEW:

DEFINER和SQL SECURITY子句指定在视图调用时检查访问特权时要使用的安全上下文。

该用户必须存在,最好使用“localhost”作为主机名。我认为如果你检查用户是否存在并在创建视图上将其更改为localhost你就不会有这个错误。

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

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

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

如果用户存在,则:

mysql> flush privileges;

进入编辑例程部分,并在底部将Security Type从Definer更改为Invoker。