当我运行以下查询时出现错误:
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
为什么我会收到该错误?我该如何解决?
答案 0 :(得分:429)
当将视图/触发器/过程从一个数据库或服务器导出到另一个数据库或服务器时,通常会发生这种情况,因为创建该对象的用户不再存在。
您有两种选择:
通过从转储中删除任何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@%'
要小心,因为这会改变所有数据库的所有定义器。
如果您在使用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
权限,或者是否可以使用更少的权限。
答案 1 :(得分:133)
最初创建SQL视图或过程的用户已被删除。如果您重新创建该用户,则应该解决您的错误。
答案 2 :(得分:47)
更新mysql后出现相同错误。
此命令后错误已修复:
mysql_upgrade -u root
每次升级MySQL时应执行mysql_upgrade。它 检查所有数据库中的所有表是否与数据库不兼容 当前版本的MySQL Server。如果发现一个表有一个 可能不兼容,请检查。如果发现任何问题, 桌子修好了。 mysql_upgrade也会升级系统表 这样您就可以利用新的特权或功能 可能已经添加了。
答案 3 :(得分:34)
如果用户存在,则:
mysql> flush privileges;
答案 4 :(得分:31)
像这样创建已删除的用户:
mysql> create user 'web2vi';
或
mysql> create user 'web2vi'@'%';
答案 5 :(得分:19)
请按照以下步骤操作:
希望有所帮助
答案 6 :(得分:18)
解决方案只是一个单行查询,如下所示:
grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;
将 ROOT
替换为您的mysql用户名。
将 PASSWORD
替换为您的mysql密码。
答案 7 :(得分:13)
对于未来的googlers:我收到了类似的消息,试图更新一个不包含任何视图的数据库中的表。经过一番挖掘后,我发现我在该表上导入了触发器,这些是由不存在的用户定义的东西。删除触发器解决了这个问题。
答案 8 :(得分:11)
通过运行以下注释修复。
grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;
如果您获得some_other
而不是web2vi
,那么您必须相应地更改名称。
答案 9 :(得分:7)
用户'web2vi'在您的mysql服务器上不存在。
请参阅http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user
如果该用户确实存在,请检查它可以访问哪些服务器,虽然我认为这将是一个不同的错误(EG您可能有web2vi @ localhost,但您正在访问数据库为web2vi @%(在任何地方)
答案 10 :(得分:6)
快速修复解决方法并转储文件:
mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
答案 11 :(得分:5)
我遇到了与root用户相同的问题,当我更换
时,它对我有用root@%
通过
root@localhost
因此,如果允许用户'web2vi'从'localhost'连接,您可以尝试:
web2vi@localhost
我已远程连接到数据库。
答案 12 :(得分:4)
我5美分。
我尝试从视图中选择时遇到了同样的错误。
但是问题似乎是这个视图,是从另一个从不同服务器的备份恢复的视图中选择的。
事实上,YES,用户无效,但从第一眼看就不明显。
答案 13 :(得分:4)
尝试将您的程序设置为
SECURITY INVOKER
Mysql默认将程序安全性设置为" DEFINER" (CREATOR OF)..你必须将安全性设置为" invoker"。
答案 14 :(得分:3)
grant all on *.* to 'username'@'%' identified by 'password' with grant option;
示例:
grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
答案 15 :(得分:3)
在我的情况下,该表有一个不存在的DEFINER用户的触发器。
答案 16 :(得分:3)
几分钟前我遇到了同样的问题,我在从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
答案 17 :(得分:2)
您的视图“view_quotes”可能已从“web2vi”为有效用户的其他数据库复制到“web2vi”不是有效用户的数据库中。
将“web2vi”用户添加到数据库或更改视图(通常删除DEFINER ='web2vi'@'%'部分并执行脚本将执行操作)
答案 18 :(得分:2)
你可以试试这个:
$ mysql -u root -p
> grant all privileges on *.* to `root`@`%` identified by 'password';
> flush privileges;
答案 19 :(得分:1)
上面的方法我都试过了,但是在创建视图的时候感觉像是重复的动作。我在更新导入数据库的视图时遇到了同样的问题。
您可以通过简单地创建具有创建权限的用户来简单地解决 LOCAL 中的问题。
答案 20 :(得分:1)
您可以将特定数据库的定义者更改为现有用户:
UPDATE mysql.proc SET definer = 'existing_user@localhost' WHERE db = 'database_name';
答案 21 :(得分:1)
来自CREATE VIEW
的{{3}}:
DEFINER和SQL SECURITY子句指定在视图调用时检查访问权限时要使用的安全上下文。
此用户必须存在,并且最好使用“localhost”作为主机名。因此,我认为如果您检查用户是否存在并在创建视图中将其更改为“localhost”,则不会出现此错误。
答案 22 :(得分:1)
为什么我会收到该错误?我该如何解决?
我花了一个小时才找到了这样一个问题的决定。但是,在我的情况下,我跑了这个:
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';
......并且,在他们每个人之后,寻找领域&#39; definer&#39;。
在我的情况下,这是一个有胡子的旧触发器,开发人员忘了删除。
答案 23 :(得分:1)
如果这是一个存储过程,您可以执行以下操作:
UPDATE `mysql`.`proc` SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'
但不建议这样做。
对我来说,更好的解决方案是创建定义器:
create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
答案 24 :(得分:1)
其他用户创建/注册的一个或多个视图。您必须检查视图的所有者并:
'web2vi'
创建的视图
醇>
我曾经遇到过这个问题。
我尝试使用SQLYog将视图从BD1迁移到BD2。 SQLYog在其他DataBase(DB2)中重新创建了视图,但它保留了BD1的用户(它们在不同的位置)。后来我意识到我在查询中使用的视图与你有相同的错误,即使我没有创建任何视图。
希望得到这个帮助。
答案 25 :(得分:1)
问题很明显 - MySQL无法找到指定为定义者的用户。
我在从开发服务器同步数据库模型,将其应用到localhost,对模型进行更改然后将其重新应用到localhost后遇到此问题。显然有一个视图(我已修改)定义,所以我无法更新我的本地版本。
如何修复(轻松):
注意:它涉及删除,因此它适用于视图,但如果您在表上尝试此操作,请确保备份数据。
P.S。这既不是一个正确的解决方案,也不是最全面的解决方案。我刚刚发布它作为一种可能(并且非常简单)的解决方案。
答案 26 :(得分:1)
进入编辑例程部分,在底部,将安全类型从Definer更改为Invoker。
答案 27 :(得分:0)
我来这里遇到同样的问题,我在我的代码中找不到某个用户正在进行操作的地方。 显然它来自一个使用长期删除的用户的触发器(db从旧版本恢复) 所以万一你像我一样困惑,看看你的db事件/触发器/例程。 希望这会对某人有所帮助。
答案 28 :(得分:0)
在我的情况下,我在该表上有一个触发器,我无法更新数据获得相同的错误。
MySQL错误1449:指定为定义者的用户不存在
解决方案是删除该表上的触发器并再次重新创建它们,这解决了问题,因为触发器是由另一个服务器的另一个用户创建的,并且在更改主机公司后更改了新服务器上的用户名。这是我的2美分
答案 29 :(得分:0)
数据库用户似乎也区分大小写,所以当我有一个root'@'%用户时,我没有ROOT'@'%用户。我通过工作台将用户改为大写,问题解决了!
答案 30 :(得分:0)
此外,要更改TRIGGERS的定义程序(ALTER不起作用),您可以这样做:
为每个触发器生成DROP和CREATE命令:
SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "yourdatabase";
在foreach中执行它。当将生产数据库带到开发机器并在所有命令上使用foreach进行操作并自动重新创建触发器时,我在应用程序中使用了此功能。这给了我自动化的选择。
PHP / Laravel中的示例:
$this->info('DROP and CREATE TRIGGERS');
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach($result as $rs){
$pdo = DB::unprepared($rs['sqlCommand']);
break;
}
提示:由于mysql缓冲区查询问题,我必须使用pdo进行操作,here
答案 31 :(得分:0)
尝试一下 这是简单的解决方案
mysql -u root -p
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
更多{@ {3}}
答案 32 :(得分:0)
///将所有或特定过程更新为您想要的现有用户
1)更新mysql
。proc
p SET定义器='root @%'其中1 = 1限制1000;
2)冲洗特权; //或重新启动服务器
答案 33 :(得分:0)
就我而言,删除所有视图即可解决问题。
DROP VIEW view_name;
答案 34 :(得分:-1)
尝试以下方法:
mysqldump --routines --single-transaction -u root -proot portalv3 > c:\portal.sql
答案 35 :(得分:-2)
您可以创建名为web2vi
的用户并授予所有权限