MySQL错误1449:作为一个定义不存在指定的用户MySQL错误1449:作为一个定义不存在指定的

2019-05-13 12:59发布

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

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

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

Answer 1:

这从一个数据库或服务器导出视图/触发器/程序时到另一个创建该对象不再存在用户通常发生。

你有两个选择:

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.创建缺少的用户

如果您发现以下错误,同时使用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

这工作就像一个魅力-你只需要改变someuser为丢失的用户名。 在本地开发服务器,你可能通常只使用root

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



Answer 2:

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



Answer 3:

我更新MySQL后,得到了同样的错误。

该错误已修复此命令后:

mysql_upgrade -u root

mysql_upgrade应该每次升级MySQL的时间执行。 它检查所有数据库中的所有表与MySQL服务器的当前版本不兼容。 如果发现一个表有可能不兼容,它被选中。 如果发现任何问题,该表被修复。 mysql_upgrade也升级了系统表,这样就可以利用这一点可能已添加新的特权或能力。



Answer 4:

如果用户存在,则:

mysql> flush privileges;


Answer 5:

创建删除的用户是这样的:

mysql> create user 'web2vi';

要么

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


Answer 6:

跟着这些步骤:

  1. 去到phpMyAdmin
  2. 选择数据库
  3. 选择你的表
  4. 在顶部的菜单中单击“触发器”
  5. 点击“编辑”编辑触发器
  6. 从[用户@本地]变更定义者根@本地

希望能帮助到你



Answer 7:

Solution is just a single line query as below :

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

Replace ROOT with your mysql user name. Replace PASSWORD with your mysql password.



Answer 8:

对于未来的Google:我有一个类似消息尝试在不包含的观点更新数据库表。 一些挖后,原来我已经进口了触发该表,而这些都是由不存在的用户定义的东西。 删除触发器解决了这个问题。



Answer 9:

通过运行这个评论如下修正。

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

如果你正在some_other代替web2vi那么你必须相应地更改名称。



Answer 10:

用户“web2vi”没有你的mysql服务器上存在。

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

如果该用户不存在,检查哪些服务器可以从访问,虽然我还以为这将是一个不同的错误(例如,您可能有web2vi @本地,但你正在访问该数据库作为web2vi @%(在任何东西)



Answer 11:

速战速决解决和转储文件:

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


Answer 12:

我只好用root用户同样的问题答它的工作对我来说,当我更换

root@%

通过

root@localhost

因此,如果用户web2vi'被允许从“本地主机”,你可以尝试连接:

web2vi@localhost

我远程连接到数据库。



Answer 13:

我5美分。

我有同样的错误,而我试图从一个视图中选择。

然而问题似乎是这种观点,从被从备份中恢复来自不同服务器的另一视图中选择。

而事实上,YES,用户是无效的,但并不明显,其中从第一次看。



Answer 14:

尝试设置你的程序为SECURITY INVOKER

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



Answer 15:

这发生在我从一台服务器移动数据库到另一台服务器后。 最初定义者使用本地主机和用户了。 在新的服务器,我们没有这样的用户和主机也发生了变化。 我把那个特定表的备份和从phpMyAdmin的手动删除所有触发器 。 此后它的工作对我罚款。



Answer 16:

在我的情况下,该表必须与并不存在一个定义用户的触发器。



Answer 17:

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

例:

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


Answer 18:

你看,“view_quotes”可能已经从不同的数据库,其中“web2vi”是一个有效的用户到数据库中,其中“web2vi”不是一个有效的用户拷贝。
无论是“web2vi”用户添加到数据库或改变视图(通常除去DEFINER =“web2vi” @“%”部分与执行脚本就可以了)



Answer 19:

我有你同样的问题分钟前,我就遇到了这个问题,删除从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中,不熟悉视窗)混合此:

> 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



Answer 20:

你可以试试这个:

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


Answer 21:

从MySQL的基准的CREATE VIEW

定义者和SQL SECURITY子句​​指定的安全上下文在查看调用时检查访问权限时使用。

该用户必须存在,始终是更好地使用“本地主机”作为主机名。 所以我认为,如果你检查用户是否存在以及其更改为在创建视图的“localhost”你不会有这样的错误。



Answer 22:

进入编辑程序部分,并在底部,安全类型从定义者变为祈求。



Answer 23:

问题是明确的 - MySQL不能找到指定的定义者用户。

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

如何修复 (容易):

注:这包括删除所以它工作得很好的意见,但要确保你有数据备份,如果你试试这个表上。

  1. 登录数据库,作为root(或任何具有足够的力量来进行更改)。
  2. 删除无论您有麻烦视图,表或。
  3. 同步您的新模式 - 它不会抱怨的东西,现在不存在了。 您可能需要从你有问题的项目定义中删除SQL SECURITY DEFINER一部分。

PS这既不适当,也不最佳全能解决。 我刚刚发布了它作为一个可能的(很简单)的解决方案。



Answer 24:

其中一个或几个您的其他用户注册的意见,并在创建/。 你必须检查视图和所有者:

  1. 重新创建用户; 作为其他的答案说。 要么
  2. 重新创建其中由用户创建的意见'web2vi'使用ALTER VIEW

我有这个问题一次。

我试图迁移的观点,从BD1到BD2,使用SQLyog的。 SQLyog的重建中的其他数据库(DB2)的意见,但它一直BD1的用户(他们其中不同)。 后来我意识到,我是用我的查询中的观点具有相同的错误,你,即使我没有创建任何视图。

希望这有助于。



Answer 25:

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

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

但是,这是不明智的。

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

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


Answer 26:

当mysql.proc的是空的,但系统始终提示为表格名“user@192.168.%”不存在,您在mysql命令行和类型只是根:

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

过度!



Answer 27:

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

我花了一个小时才找到了这样的问题作出决定。 但是,在我的情况,我跑了这一点:

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';

...而且,他们每个人之后,找现场“定义者”。

在我的情况下,它是大胡子的老触发,即开发商有人忘了删除。



Answer 28:

这发生在我身上后,我进口转储在Windows 10与MySQL工作台6.3社区,具有“root @%不存在”。 即使用户存在。 首先,我试过不过注释掉定义者,这并不工作。 我那时的字符串替换“根@%”“根@本地”和重新导入转储。 这奏效了我。



Answer 29:

该数据库用户也似乎是大小写敏感的,所以当我有一个根“@”%的用户,我没有一键ROOT“@”%的用户。 我改变通过工作台大写的用户,问题就解决了!



Answer 30:

在我来说,我对这个表,我无法更新数据得到相同的错误触发。

MySQL错误1449:作为一个定义不存在指定的用户

解决办法是删除该表上的触发器,再重新创建它们,这个固定的问题,因为触发与来自另一个服务器的其他用户,并且用户名更改托管公司后,新的服务器上做改变。 这是我的2美分



文章来源: MySQL error 1449: The user specified as a definer does not exist