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

时间:2012-04-16 07:08:05

标签: mysql permissions

当我运行以下查询时出现错误:

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

为什么我会收到该错误?我该如何解决?

36 个答案:

答案 0 :(得分:429)

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

您有两种选择:

1。更改DEFINER

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

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

How to change the definer for views

  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语句

  3. How to change the definer for stored procedures

    示例:

    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权限,或者是否可以使用更少的权限。

答案 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)

请按照以下步骤操作:

  1. 转到PHPMyAdmin
  2. 选择您的数据库
  3. 选择您的表格
  4. 点击顶部菜单点击“触发器”
  5. 点击“修改”以修改触发器
  6. 将definer从[user @ localhost]更改为root @ localhost
  7. 希望有所帮助

答案 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)

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

  1. 重新创建用户;正如其他答案所说。 或
  2. 使用ALTER VIEW
  3. 重新创建用户'web2vi'创建的视图

    我曾经遇到过这个问题。

    我尝试使用SQLYog将视图从BD1迁移到BD2。 SQLYog在其他DataBase(DB2)中重新创建了视图,但它保留了BD1的用户(它们在不同的位置)。后来我意识到我在查询中使用的视图与你有相同的错误,即使我没有创建任何视图。

    希望得到这个帮助。

答案 25 :(得分:1)

问题很明显 - MySQL无法找到指定为定义者的用户。

我在从开发服务器同步数据库模型,将其应用到localhost,对模型进行更改然后将其重新应用到localhost后遇到此问题。显然有一个视图(我已修改)定义,所以我无法更新我的本地版本。

如何修复(轻松)

注意:它涉及删除,因此它适用于视图,但如果您在表上尝试此操作,请确保备份数据。

  1. 以root身份登录数据库(或任何有足够权力进行更改的内容)。
  2. 删除您遇到问题的视图,表格或其他内容。
  3. 同步你的新模型 - 它不会抱怨现在不存在的东西。您可能希望从您遇到问题的项目定义中删除 SQL SECURITY DEFINER 部分。
  4. 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)更新mysqlproc 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的用户并授予所有权限