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

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

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 

为什么我得到这个错误? 我如何解决它?

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

你有两个select:

1.更改DEFINER

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

稍后更改定义者是一个更棘手的问题:

如何改变视图的定义

  1. 运行这个SQL来生成必要的ALTER语句

     SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", table_name, " AS ", view_definition, ";") FROM information_schema.views WHERE table_schema='your-database-name'; 
  2. 复制并运行ALTER语句

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

例:

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

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

2.创build缺less的用户

如果您在使用MySQL数据库时发现以下错误:

 The user specified as a definer ('someuser'@'%') does not exist` 

那么你可以使用以下方法解决它:

 GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES; 

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

这就像一个魅力 – 你只需要改变一些用户到缺less的用户的名字。 在本地开发服务器上,通常可以使用root

还要考虑你是否真的需要授予用户ALL权限,或者他们是否可以less做。

最初创buildSQL视图或过程的用户已被删除。 如果您重新创build该用户,它应该解决您的错误。

如果用户存在,则:

 mysql> flush privileges; 

像这样创build已删除的用户:

 mysql> create user 'web2vi'; 

要么

 mysql> create user 'web2vi'@'%'; 

对于未来的谷歌search:我收到了类似的消息,试图更新不包含视图的数据库中的表。 经过一些挖掘,原来我已经在该表中导入触发器,这些是由不存在的用户定义的东西。 放下触发器解决了这个问题。

按着这些次序:

  1. 去PHPMyAdmin
  2. select您的数据库
  3. select你的桌子
  4. 在顶部菜单上点击“触发器”
  5. 点击“编辑”编辑触发器
  6. 将定义者从[user @ localhost]更改为root @ localhost

希望能帮助到你

解决scheme只是一个单行查询如下:

 grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option; 

用你的mysql用户名replaceROOT 。 用您的mysql密码replace密码。

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

请参阅http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user

如果该用户确实存在,请检查它可以访问哪些服务器,尽pipe我会认为这将是一个不同的错误(EG可能有web2vi @ localhost,但你访问数据库为web2vi @%(在任何情况下)

我的5美分。

我尝试从视图中select时出现同样的错误。

但是,问题似乎是从另一个从不同服务器的备份中恢复的视图中select的这个视图。

而事实上,YES,用户是无效的,但从第一眼看哪里并不明显。

尝试设置您的程序为SECURITY INVOKER

Mysql默认设置程序的安全性为“DEFINER”(创build者)..你必须将安全设置为“调用者”。

快速修复以解决该问题并转储文件:

 mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql 

我和root用户ans有同样的问题

 root@% 

通过

 root@localhost 

所以,如果用户'web2vi'被允许连接'本地主机',你可以尝试:

 web2vi@localhost 

我已经远程连接到数据库。

在我的情况下,表中有一个DEFINER用户不存在的触发器。

通过运行以下评论修复。

 grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option; FLUSH PRIVILEGES; 

如果你正在获取some_other而不是web2vi那么你必须相应地更改名称。

您的视图“view_quotes”可能已经从“web2vi”是有效用户的不同数据库复制到“web2vi”不是有效用户的数据库中。
可以将“web2vi”用户添加到数据库或更改视图(通常删除DEFINER ='web2vi'@'%'部分并执行该脚本将执行该操作)

你可以试试这个:

 $ mysql -u root -p > grant all privileges on *.* to `root`@`%` identified by 'password'; > flush privileges; 

进入编辑例程部分,在底部,将安全types从Definer更改为Invoker。

问题很明显 – MySQL找不到指定的用户作为定义者。

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

如何解决 (容易)

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

  1. 以root身份login数据库(或任何有足够权力进行更改的人)。
  2. 删除视图,表格或任何你有麻烦。
  3. 同步你的新模型 – 它不会抱怨现在不存在的东西。 您可能希望从您遇到问题的项目定义中删除SQL SECURITY DEFINER部分。

PS这既不是一个适当的,也不是最好的全面的修复。 我只是把它作为一个可能(而且非常简单)的解决scheme。

几分钟前,我遇到了同样的问题,从mysql.user表中删除一个未使用的用户后,遇到了这个问题,但是修改视图修复了这个问题,这是一个非常简单的命令:

 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

其他用户创build/注册的一个或多个视图。 你必须检查视图的所有者和:

  1. 重新创build用户; 作为其他答案说。 要么
  2. 使用ALTER VIEW重新创build由用户'web2vi'创build的视图

我有这个问题一次。

我试图使用SQLYog将视图从BD1迁移到BD2。 SQLYog在其他数据库(DB2)中重新创build视图,但它保留了BD1的用户(他们在哪里不同)。 后来,我意识到,我在查询中使用的观点与您有同样的错误,即使我没有创build任何视图。

希望这个帮助。

当mysql.proc是空的,但系统总是注意到“user@192.168.%”为table_name不存在,你只需在MySQL命令行中的根,并键入:

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

过度!

在我使用MYSQL Workbench 6.3 Community在Windows 10上导入转储后,发生了这种情况,“root @%不存在”。 即使用户存在。 首先,我试图评论出DEFINER,但是,这没有奏效。 然后我用“root @ localhost”“root @%”上做了一个stringreplace,并重新导入了转储。 这为我做了诡计。

CREATE VIEW MySQL引用 :

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

这个用户必须存在,最好使用'localhost'作为主机名。 所以我认为,如果你检查用户是否存在,并在创build视图中将其更改为“localhost”,则不会出现此错误。

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

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

但是这不是build议的。

对我而言,更好的解决scheme是创build定义者:

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

数据库用户也似乎区分大小写,所以虽然我有一个根'@'%用户,我没有一个ROOT'@'%用户。 我改变了用户通过工作台大写,问题已解决!

为什么我得到这个错误? 我如何解决它?

我花了一个小时才find这样的问题的决定。 但是,就我而言,我跑了这个:

 mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2; ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist 

如果你真的想find问题,只需要逐个运行这个命令:

 SHOW PROCEDURE STATUS; SHOW FUNCTION STATUS; SHOW TRIGGERS; SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW'; 

…之后,他们每个人,寻找领域的“定义”。

在我的情况下,这是一个有胡子的旧触发器,有些开发人员忘了删除。

在我的情况下,我有一个表上的触发器,我无法更新数据获取相同的错误。

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

解决方法是删除该表上的触发器并重新创build它们,这样就解决了问题,因为触发器是由另一个服务器上的另一个用户创build的,并且更改托pipe公司后,新服务器上的用户名更改。 这是我的2美分

我来到这里是为了同样的问题,我无法在我的代码中find某个用户正在执行操作的任何地方。 显然是从一个触发器使用一个长时间删除的用户(分贝从旧版本恢复),所以如果你像我一样困惑,看看你的数据库事件/触发器/例程。 希望这会帮助别人。

您可以使用名称web2vi创build用户并授予所有特权

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

例:

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