【问题标题】:MySQL error 1449: The user specified as a definer does not existMySQL 错误 1449:指定为定义者的用户不存在
【发布时间】:2012-04-27 12:53:24
【问题描述】:

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

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

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

【问题讨论】:

  • 向我们展示您的 SHOW CREATE VIEW 'view_quotes'
  • 错误必须在view_quotes视图的where条件下。
  • 想了一会儿,最简单的做法是将丢失的帐户添加到数据库中,错误就消失了。无需复杂的程序。如果您可以添加帐户,请先尝试。
  • 我在尝试恢复某些视图时遇到了同样的错误,我从我拥有的 onlyViews.sql 文件中删除了“DEFINER=root@%”,问题解决了。如果您有非常大的 .sql 文件,您可以通过 specefiv 文件编辑器打开和编辑它。

标签: mysql permissions


【解决方案1】:

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

你有两个选择:

1。更改定义器

在最初导入数据库对象时,这可能是最容易做到的,方法是从转储中删除任何 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 语句

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

【讨论】:

  • . 和授权选项不是必需的。
  • 我认为添加一个无意义的用户会更容易,因为下次你做一个dbdump并导入它时,你不需要再次进行视图/程序编辑
  • 谢谢,我刚刚删除了有问题的表,删除了DEFINER=`user`@`host` 并重新导入了它。像魅力一样工作。 :ok_hand:
  • 几乎完成:第一部分需要类似的节用于 triggers 表。
  • 正如@Otheus 所述,答案不完整。 DEFINER 不仅可以是 VIEWS 和 ROUTINES 的一部分,还可以是 EVENTS 和 TRIGGER 的一部分。要查看缺少的定义器在哪里使用,您可以使用以下查询:SELECT DEFINER,'events' FROM INFORMATION_SCHEMA.EVENTS union SELECT DEFINER,'routines' FROM INFORMATION_SCHEMA.ROUTINES union SELECT DEFINER,'triggers' FROM INFORMATION_SCHEMA.TRIGGERS union SELECT DEFINER, 'views' FROM INFORMATION_SCHEMA.VIEWS;
【解决方案2】:

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

【讨论】:

  • 此外,您至少需要向添加的用户授予SELECTEXECUTE 权限。当我将数据库备份从一台服务器导出到另一台服务器时,我遇到了这个问题,其中创建例程的用户在测试服务器上不存在。
  • 谢谢,这很有帮助。通常,在使用 mysqldump 迁移或部署时,创建 VIEW、TRIGGER 或 PROCEDURE(定义者)的用户在目标系统上可能不同。在这种情况下,只需使用目标系统上的有效用户重新创建过程、触发器或视图(DROP 然后重新CREATE)就可以解决问题。
  • 您还可以将定义者更改为现有用户:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
  • 正是在我的情况下,我有一个带有触发器的表,该表指向已删除的 DEFINER 用户。更新触发器用户解决了这个问题。
  • 您还需要向该用户授予权限 :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
【解决方案3】:

更新mysql后出现同样的错误。

执行此命令后错误已修复:

mysql_upgrade -u root

mysql_upgrade 应该在每次升级 MySQL 时执行。它 检查所有数据库中的所有表是否与 MySQL 服务器的当前版本。如果发现一个表有 可能不兼容,已检查。如果发现任何问题, 桌子修好了。 mysql_upgrade 还升级系统表 以便您可以利用新的特权或功能 可能已添加。

【讨论】:

  • 不知道为什么这对我不起作用,我不得不手动删除 mySQL 工作台中的所有触发器。
  • 当我运行命令时,我在控制台上收到以下消息。 mysql_upgrade 客户端现已弃用。升级客户端执行的操作现在由服务器完成。
  • 从 MySQL 5.6 升级到 MySQL 5.7.33,这个命令完成了工作并解决了问题!感谢您提供此解决方案。这比篡改数据库信息模式要简单得多,也更让人放心。太糟糕了(在 Ubuntu 20.04 上)包升级不会在每次升级 MySQL 二进制文件后本机执行此命令...
  • 不建议在mariaDB上运行,运行后出现问题
【解决方案4】:

按照以下步骤操作:

  1. 转到 PHPMyAdmin
  2. 选择您的数据库
  3. 选择您的餐桌
  4. 在顶部菜单上点击“触发器”
  5. 点击“编辑”以编辑触发器
  6. 将定义器从 [user@localhost] 更改为 root@localhost

希望对你有帮助

【讨论】:

  • 这是问题的实际解决方案,而不是创建用户并授予权限。只需更改定义器即可。
  • 有没有办法找到数据库中的所有触发器?
  • 查找所有触发器:SHOW TRIGGERS
  • 从命令行“show triggerss”,从 PhpMyAdmin 中选择数据库,然后在导航栏的右上角单击触发器
【解决方案5】:

如果用户存在,那么:

mysql> flush privileges;

【讨论】:

    【解决方案6】:

    像这样创建已删除的用户:

    mysql> create user 'web2vi';
    

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

    【讨论】:

    • 创建错过的用户后,遇到另一个错误:ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo',应该在创建用户后添加此命令grant all on *.* to 'web2vi'@'%' identified by ''
    【解决方案7】:

    解决方案只是单行查询,如下所示:

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

    ROOT 替换为您的 mysql 用户名。 将 PASSWORD 替换为您的 mysql 密码。

    【讨论】:

    • 注意:MySQL 用户区分大小写。
    • 在此之后我需要 flush privileges 并且它有效。谢谢。
    【解决方案8】:

    通过运行以下 cmets 修复。

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

    如果您得到的是some_other 而不是web2vi,那么您必须相应地更改名称。

    【讨论】:

      【解决方案9】:

      对于未来的谷歌员工:我收到了类似的消息,试图更新数据库中不包含视图的表。经过一番挖掘,事实证明我已经在该表上导入了触发器,这些是不存在的用户定义的东西。删除触发器解决了这个问题。

      【讨论】:

      • 触发器是问题,我在触发器部分更新了定义器。没有更多的问题。
      • 谢谢,很有帮助。还需要更新视图。
      • 确实很有帮助 :) 我永远不会单独找到它。
      【解决方案10】:
      grant all on *.* to 'username'@'%' identified by 'password' with grant option;
      

      示例:

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

      【讨论】:

      • 如果我将所有权限授予“用户”@“所有 ips”,那么安全性呢??!!
      • @MohsenAbasi 这是开发环境的示例。该用户可以是系统管理员。 prod 环境需要更加小心。
      【解决方案11】:

      快速解决并转储文件:

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

      【讨论】:

      • 这不起作用。定义器包含在转储中。
      • 如果你使用带有“p”而不是“d”的mysqlpump,你可以使用--skip-definer
      • @lyhong 我没有详细的解释,但显然--single-transaction 改变了在转储期间实现锁定表的方式。或类似的东西。我不记得我在哪里读到的,但这让我对“只是把旗帜扔进去”感到舒服。我也对无法解释的“就这样做”“答案”感到不安。无论哪种方式,它都适用于我的情况。
      【解决方案12】:

      我在使用 root 用户时遇到了同样的问题,当我更换时它对我有用

      root@%
      

      通过

      root@localhost
      

      所以,如果允许用户'web2vi'从'localhost'连接,你可以试试:

      web2vi@localhost
      

      我已远程连接到数据库。

      【讨论】:

        【解决方案13】:

        您的 mysql 服务器上不存在用户“web2vi”。

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

        如果该用户确实存在,请检查它可以访问哪些服务器,尽管我认为这将是一个不同的错误(例如,您可能有 web2vi@localhost,但您正在以 web2vi@% 的身份访问数据库(在任何情况下) )

        【讨论】:

          【解决方案14】:

          在将数据库从一台服务器移动到另一台服务器后,这发生在我身上。最初,定义者使用 localhost 和用户。在新服务器上,我们没有该用户,并且主机也已更改。我备份了那个特定的表并从 phpmyadmin 中手动删除了所有触发器。之后它对我来说一直很好。

          【讨论】:

          • 感谢您的提示,我能够手动删除 mySQL 工作台中的所有触发器。
          • 这对我来说确实是一个触发问题,我不得不将它们全部删除并重新创建
          • 除了重新创建触发器还有其他解决方案吗?我有时一天两次使用测试转储。这会打乱我的主要流程
          • @TS Guhan 您手动删除触发器后是否重新添加了触发器?
          【解决方案15】:

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

          我花了一个小时才找到解决此类问题的决定。但是,就我而言,我运行了这个:

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

          ...然后,在每个之后,查找字段“定义器”。

          在我的例子中,它是有胡子的旧触发器,开发人员忘记删除了。

          【讨论】:

            【解决方案16】:

            我的 5 美分。

            我在尝试从视图中选择时遇到了同样的错误。

            但问题似乎是这个视图是从另一个从不同服务器的备份中恢复的视图中选择的。

            事实上,是的,用户是无效的,但从第一眼看并不明显。

            【讨论】:

              【解决方案17】:

              几分钟前我遇到了同样的问题,我在从 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,不熟悉windows):

              > echo above_query | mysql -uuser -p > alterView.sql
              > mysql -uuser -ppass databasename < alterView.sql
              

              注意:该命令会在文件上生成额外的 SELECT CONCAT,如果不删除它,mysql -uuser -ppass databasename &lt; alterView.sql 会失败。

              来源:https://dba.stackexchange.com/questions/4129/modify-definer-on-many-views

              【讨论】:

                【解决方案18】:

                尝试将您的程序设置为 SECURITY INVOKER

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

                【讨论】:

                  【解决方案19】:

                  您的视图“view_quotes”可能已从“web2vi”是有效用户的不同数据库复制到“web2vi”不是有效用户的数据库中。
                  将“web2vi”用户添加到数据库或更改视图(通常删除 DEFINER='web2vi'@'%' 部分并执行脚本即可)

                  【讨论】:

                    【解决方案20】:

                    在我的例子中,该表有一个触发器,其中包含不存在的 DEFINER 用户。

                    【讨论】:

                    • 当应用程序从服务器转移到另一个服务器时,特别是在钉子上
                    【解决方案21】:

                    来自CREATE VIEWMySQL reference

                    DEFINER 和 SQL SECURITY 子句指定在视图调用时检查访问权限时要使用的安全上下文。

                    此用户必须存在,并且总是最好使用 'localhost' 作为主机名。所以我认为,如果您检查用户是否存在并在创建视图时将其更改为“localhost”,则不会出现此错误。

                    【讨论】:

                      【解决方案22】:

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

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

                      如何解决(轻松)

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

                      1. 以 root 身份登录数据库(或任何有足够权力进行更改的人)。
                      2. 删除视图、表格或您遇到问题的任何内容。
                      3. 同步您的新模型 - 它不会抱怨现在不存在的东西。您可能希望从遇到问题的项目定义中删除 SQL SECURITY DEFINER 部分。

                      附:这既不是适当的解决方案,也不是最全面的解决方案。我只是把它作为一个可能(而且非常简单)的解决方案发布。

                      【讨论】:

                      • 我正在使用 toad,cn 我使用该操作系统删除并重新创建,我应该从终端以 rooy 身份登录,然后才这样做??
                      【解决方案23】:

                      你可以试试这个:

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

                      【讨论】:

                        【解决方案24】:

                        进入编辑例程部分,在底部,将安全类型从定义者更改为调用者。

                        【讨论】:

                        • 去哪里?在哪个软件中?
                        • @kenorb,在 phpMyAdmin 中您可以更改 MySQL 存储的例程(过程和函数),例如安全类型。
                        【解决方案25】:

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

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

                        我曾经遇到过这个问题。

                        我尝试使用 SQLYog 将视图从 BD1 迁移到 BD2。 SQLYog 在另一个数据库 (DB2) 中重新创建了视图,但它保留了 BD1 的用户(它们在不同的地方)。后来我意识到我在查询中使用的视图与你有同样的错误,即使我没有创建任何视图。

                        希望对您有所帮助。

                        【讨论】:

                          【解决方案26】:

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

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

                          但不建议这样做。

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

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

                          【讨论】:

                          • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'grant all on 'mytable'.* to 'myuser' 标识的 'mypass';' 附近使用在第 1 行
                          • @Cerin,只需将 mytable 周围的 '' 更改为 ``。我的回答旨在帮助人们解决这个问题..考虑重新考虑你的否决..
                          【解决方案27】:

                          当 mysql.proc 为空时,系统总是提示“user@192.168.%” for table_name 不存在,你只需在 mysql 命令行中 root 并输入:

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

                          结束!

                          【讨论】:

                            【解决方案28】:

                            在我的情况下,我在那个表上有一个触发器,我无法更新数据,得到同样的错误。

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

                            解决方案是删除该表上的触发器并重新创建它们,这解决了问题,因为触发器是由另一台服务器的另一个用户创建的,并且在更改托管公司后新服务器上的用户名发生了更改。这是我的 2 美分

                            【讨论】:

                              【解决方案29】:

                              我来这里是为了同样的问题,我在我的代码中找不到某个用户正在执行操作的任何地方。 显然它来自使用长期删除的用户的触发器(数据库是从旧版本恢复的) 因此,如果您像我一样感到困惑,请查看您的数据库事件/触发器/例程。 希望这会对某人有所帮助。

                              【讨论】:

                                【解决方案30】:

                                这发生在我使用 MYSQL Workbench 6.3 Community 在 Windows 10 上导入转储后,“root@% 不存在”。即使用户存在。 首先,我尝试注释掉 DEFINER,但是这不起作用。 然后我用 "root@localhost""root@%" 进行了字符串替换,然后重新导入了转储。这对我有用。

                                【讨论】:

                                  猜你喜欢
                                  • 2016-11-16
                                  • 2020-09-19
                                  • 2020-08-23
                                  • 2017-02-16
                                  • 1970-01-01
                                  • 2019-01-04
                                  • 2013-12-09
                                  • 2021-07-28
                                  相关资源
                                  最近更新 更多