当我运行以下查询时,我得到一个错误:

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

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

最佳答案

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

您有两种选择:

1.更改定义

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

稍后更改定义器比较棘手:

How to change the definer for views

  • 运行此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语句

  • How to change the definer for stored procedures

    例:
    UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
    

    注意,因为这将更改所有数据库的所有定义器。

    2.创建丢失的用户



    http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

    这就像一种魅力-只需将someuser更改为丢失用户的名称。在本地开发服务器上,通常可能只使用root

    还要考虑您是否实际上需要授予用户ALL权限,或者他们是否可以做得更少。

    09-27 10:52