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

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的用户(它们是不同的)。后来我意识到,我在查询中使用的视图与您的错误相同,即使我没有创建任何视图。

希望这对你有所帮助。

其他回答

我在更新mysql后得到了同样的错误。

这个错误已经被修复:

mysql_upgrade -u root

mysql_upgrade应该在每次升级MySQL时执行。它 方法检查所有数据库中的所有表是否与 MySQL服务器的当前版本。如果一个表被发现有 可能的不兼容性,它被检查。如果发现任何问题, 桌子修好了。Mysql_upgrade也升级系统表 这样你就可以利用新的特权或能力 可能是加进去的。

您可以创建名为web2vi的用户,并授予所有权限

从MySQL参考CREATE VIEW:

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

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

当创建该对象的用户不再存在时,通常会发生这种情况,即从一个数据库或服务器将视图/触发器/过程导出到另一个数据库或服务器。

你有两个选择:

1. 更改DEFINER

在最初导入数据库对象时,通过从转储中删除任何DEFINER语句,这可能是最容易做到的。

稍后更改定义器就有点棘手了:

如何更改视图定义器

运行此SQL生成必要的ALTER语句 SELECT CONCAT("ALTER DEFINER= ' youruser ' @ ' host ' VIEW ", table_name, " AS ", view_definition, ";") 从information_schema.views 在table_schema =“your-database-name”; 复制并运行ALTER语句

如何更改存储过程的定义器

例子:

UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'

要小心,因为这将更改所有数据库的所有定义器。

2. 创建缺少的用户

如果您在使用MySQL数据库时发现以下错误: 指定为定义器的用户('someuser'@'%')不存在' 然后你就可以解 它使用以下方法: 授予所有*。* 'someuser'@'%' IDENTIFIED BY 'complex-password'; 冲洗特权;

从http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

这就像一个魔法——你只需要把someuser改成丢失用户的名字。在本地开发服务器上,通常只使用root。

还要考虑是否真的需要授予用户所有权限,或者他们是否可以用更少的权限。

我有同样的问题与根用户和它为我工作时,我替换

root@%

by

root@localhost

所以,如果用户'web2vi'被允许从'localhost'连接,你可以尝试:

web2vi@localhost

我远程连接到数据库了。