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

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@%”上的字符串,并重新导入转储。这招对我很管用。

其他回答

几分钟前我遇到了你同样的问题,我从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 --routines --single-transaction -u root -proot portalv3 > c:\portal.sql

问题很明显——MySQL无法找到指定为定义器的用户。

在从开发服务器同步数据库模型,将其应用到localhost,对模型进行更改,然后将其重新应用到localhost之后,我遇到了这个问题。显然有一个视图(我修改)定义,所以我不能更新我的本地版本。

如何修复(很容易):

注意:它涉及到删除,所以它对视图工作得很好,但如果你在表上尝试这样做,请确保你有数据备份。

以根用户身份登录数据库(或任何有足够权限进行更改的用户)。 删除视图,表或任何你有问题的东西。 同步你的新模型——它不会抱怨现在不存在的东西。您可能希望从有问题的项定义中删除SQL SECURITY DEFINER部分。

附注:这既不是一个合适的也不是最好的解决方案。我只是把它作为一个可能的(非常简单的)解决方案发布出来。

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

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

但这是不建议的。

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

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

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