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
语句,这可能是最容易做到的。
稍后更改定义者是一个更棘手的问题:
如何改变视图的定义
-
运行这个SQL来生成必要的ALTER语句
SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", table_name, " AS ", view_definition, ";") FROM information_schema.views WHERE table_schema='your-database-name';
-
复制并运行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:我收到了类似的消息,试图更新不包含视图的数据库中的表。 经过一些挖掘,原来我已经在该表中导入触发器,这些是由不存在的用户定义的东西。 放下触发器解决了这个问题。
按着这些次序:
- 去PHPMyAdmin
- select您的数据库
- select你的桌子
- 在顶部菜单上点击“触发器”
- 点击“编辑”编辑触发器
- 将定义者从[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找不到指定的用户作为定义者。
从开发服务器同步数据库模型后,我遇到了这个问题,将其应用到本地主机,对模型进行更改,然后重新将其应用到本地主机。 显然有一个观点(我修改)定义,所以我不能更新我的本地版本。
如何解决 (容易) :
注意:这涉及到删除,所以对于视图来说工作得很好,但是如果你在表上尝试这个,确保你有数据备份。
- 以root身份login数据库(或任何有足够权力进行更改的人)。
- 删除视图,表格或任何你有麻烦。
- 同步你的新模型 – 它不会抱怨现在不存在的东西。 您可能希望从您遇到问题的项目定义中删除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/注册的一个或多个视图。 你必须检查视图的所有者和:
- 重新创build用户; 作为其他答案说。 要么
- 使用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;