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

482

运行以下查询时我会收到一个错误:

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 - 指定的定义者用户 ('web2vi'@'%') 不存在

我为什么会出现这个错误?如何解决?


8
给我们展示你的SHOW CREATE VIEW 'view_quotes'命令结果。 - jordeu
2
经过一番思考,最简单的做法是将缺失的账户添加到数据库中,这样错误就消失了。不需要复杂的程序。如果您可以添加该账户,请首先尝试这样做。 - user1794918
更简单的方法是直接创建用户! - MinhajulAnwar
1
我在插入时只是遇到了这个问题 - Datadimension
1
为什么定义者需要被定义才能进行任何简单的数据库更改,是谁设计了这种东西。 - kenorb
显示剩余3条评论
41个回答

11
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

例子:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;

如果我授予“用户”@“所有IP”的所有权限,那么安全性呢?! - Mohsen Abasi
@MohsenAbasi 这是一个开发环境的示例。该用户可以成为系统管理员。生产环境需要更加小心。 - mesutpiskin

9
我遇到了与root用户相同的问题,当我替换了这个内容时,它对我起作用了。
root@%

by

root@localhost

因此,如果允许用户“web2vi”从“localhost”连接,则可以尝试:

web2vi@localhost

我远程连接到数据库。


8

7

在将数据库从一个服务器迁移到另一个服务器后,我遇到了这个问题。最初,定义者使用的是localhost和用户。在新服务器上,我们没有该用户,并且主机也已更改。我备份了该特定表并从phpmyadmin手动删除了所有触发器。之后,它一直正常工作。


谢谢你的提示,我已经成功手动删除了MySQL Workbench中的所有触发器。 - user752746
这确实是一个触发问题,我不得不将它们全部删除并重新创建。 - paul.ago
除了重新创建触发器,还有其他解决方案吗?我有时一天使用测试转储两次。这会干扰我的主要流程。 - redestructa
@TS Guhan,在您手动删除触发器后,您是否重新添加了它们? - MailBlade

7

我为什么会收到这个错误?如何修复它?

我花了一个小时才找到解决类似问题的方法。但是在我的情况下,我运行了以下命令:

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”字段。

在我的情况下,是一位长胡子老触发器,有些开发人员忘记删除了它。


4

尝试将您的存储过程设置为SECURITY INVOKER

MySQL默认将存储过程安全性设置为“DEFINER”(创建者).. 您必须将安全性设置为“invoker”。


4

我的个人经验。

当我尝试从一个视图中进行选择时,出现了同样的错误。

然而问题似乎是因为这个视图是从另一个视图中选择的,而这个视图是从不同服务器的备份中恢复的。

实际上,是用户无效了,但是第一眼看起来并不明显。


4

您可以将指定数据库的定义者更改为现有用户:

UPDATE mysql.proc SET definer = 'existing_user@localhost' WHERE db = 'database_name';

4

我刚才也遇到了您同样的问题,我在从mysql.user表中删除未使用的用户后遇到了这个问题,但通过执行alter view命令解决了问题,以下是一个非常方便的命令,使其变得非常简单:

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

3
问题很明显 - MySQL找不到指定为定义者的用户。
在将开发服务器上的数据库模型同步到本地主机后,对其进行修改并重新应用到本地主机后,我遇到了这个问题。显然有一个视图(我进行了修改)被定义,所以我无法更新本地版本。
如何轻松解决:
注意:这涉及到删除,因此它适用于视图,但如果您尝试在表格上使用此方法,请确保已备份数据。
1. 以root(或具有足够权限进行更改的其他用户)身份登录到数据库。 2. 删除视图、表格或任何您遇到问题的对象。 3. 同步新模型 - 现在它不会抱怨不存在的东西了。您可能需要从您遇到问题的对象定义中删除“SQL SECURITY DEFINER”部分。
注:这既不是正确的解决方法,也不是最佳的解决方案。我只是发布了一个可能的(非常简单)解决方案。

我正在使用Toad,我能否仅使用它删除并重新创建操作系统?我应该从终端登录为root然后再执行吗? - Vasanth Nag K V
浏览了所有其他答案,发现更多错误需要处理,但没有时间。需要一个非常快速的解决方案。最后,我删除了所有无用的触发器,在开发环境中不需要它们(数据库从生产环境导入),然后它就可以工作了。为什么这些愚蠢的错误会阻止用户进行任何简单的数据库更新呢?这是荒谬的。 - kenorb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接