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

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。Proc是空的,但是系统总是提示“user@192.168.%”的table_name不存在,你只需要在mysql命令行中输入root:

CHECK TABLE `database`.`table_name` QUICK FAST MEDIUM CHANGED;
flush privileges;

结束了!

其他回答

我已经尝试了上面的方法,但在创建视图时感觉像是重复的操作。我在更新导入数据库的视图时遇到了同样的问题。

您可以在LOCAL中简单地通过创建具有create权限的User来解决这个问题。

用户web2vi在你的mysql服务器上不存在。

看到http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html error_er_no_such_user

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

//更新所有或特定的程序到你想要的,使用现有的用户(我的case -root)

1) 更新mysql。SET definer = 'root@%' WHERE 1=1 LIMIT 1000; (limit子句是由于不同的mysql版本在更新时没有使用limit或没有使用where condition而导致的)

2) 冲洗特权;//或重新启动服务器

在我的例子中,删除所有视图解决了这个问题。

DROP VIEW view_name;

从MySQL参考CREATE VIEW:

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

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