当我运行以下查询我得到一个错误:
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
从转储语句。
更改后定义者是一个更小技巧:
如何更改视图定义者
运行该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.创建缺少的用户
如果您发现以下错误,同时使用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:
跟着这些步骤:
- 去到phpMyAdmin
- 选择数据库
- 选择你的表
- 在顶部的菜单中单击“触发器”
- 点击“编辑”编辑触发器
- 从[用户@本地]变更定义者根@本地
希望能帮助到你
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不能找到指定的定义者用户。
我从开发服务器同步数据库模型,将其应用于本地主机,在更改模型,然后重新应用它到本地主机后,遇到了这个问题。 显然,有一种观点(我修改)定义,所以我不能更新我的本地版本。
如何修复 (容易):
注:这包括删除所以它工作得很好的意见,但要确保你有数据备份,如果你试试这个表上。
- 登录数据库,作为root(或任何具有足够的力量来进行更改)。
- 删除无论您有麻烦视图,表或。
- 同步您的新模式 - 它不会抱怨的东西,现在不存在了。 您可能需要从你有问题的项目定义中删除SQL SECURITY DEFINER一部分。
PS这既不适当,也不最佳全能解决。 我刚刚发布了它作为一个可能的(很简单)的解决方案。
Answer 24:
其中一个或几个您的其他用户注册的意见,并在创建/。 你必须检查视图和所有者:
- 重新创建用户; 作为其他的答案说。 要么
- 重新创建其中由用户创建的意见
'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