Ошибка MySQL 1449: пользователь, указанный как определитель, не существует

237

Когда я запускаю следующий запрос, я получаю сообщение об ошибке:

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

Почему я получаю эту ошибку? Как это исправить?

  • 6
    Покажите нам ваше ШОУ СОЗДАТЬ ВИД "view_quotes"
  • 0
    Ошибка должна быть в том месте, где вид view_quotes .
Показать ещё 1 комментарий
Теги:
permissions

34 ответа

351

Это обычно происходит при экспорте представлений/триггеров/процедур из одной базы данных или сервера в другой, поскольку пользователь, создавший этот объект, больше не существует.

У вас есть два варианта:

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 или они могут сделать меньше.

  • 1
    , и вариант предоставления не требуются.
  • 0
    @Simon East: Вы сделали прекрасное редактирование, большое спасибо за улучшение ответа.
Показать ещё 8 комментариев
127

Пользователь, который изначально создал представление или процедуру SQL, был удален. Если вы воссоздаете этого пользователя, он должен устранить вашу ошибку.

  • 3
    Кроме того, вам необходимо предоставить как минимум привилегии SELECT и EXECUTE добавленному пользователю. Я столкнулся с этим, когда экспортировал резервную копию БД с одного сервера на другой, где пользователь, создавший подпрограммы, не существовал на тестовом сервере.
  • 5
    Спасибо, это было полезно. Часто при миграции или развертывании с использованием mysqldump пользователь, создавший VIEW, TRIGGER или PROCEDURE (определитель), может не совпадать в целевой системе. В этом случае, просто воссоздав процедуру, триггер или просмотр ( DROP затем CREATE ), используя действительного пользователя в целевой системе, нужно добиться цели.
Показать ещё 3 комментария
32

Если пользователь существует, то:

mysql> flush privileges;
  • 0
    что-то настолько простое, что я очень скучаю лол
  • 0
    Эта маленькая чертова вещь отсутствует.
24

Создайте удаляемого пользователя следующим образом:

mysql> create user 'web2vi';

или

mysql> create user 'web2vi'@'%';
  • 0
    спасибо за особенность, это спасает меня еще один Google :)
  • 0
    это сработало для меня, спасибо
Показать ещё 2 комментария
17

Я получил ту же ошибку после обновления mysql.

Ошибка была исправлена после этой команды:

mysql_upgrade -u root

mysql_upgrade должен выполняться каждый раз при обновлении MySQL. Он проверяет все таблицы во всех базах данных на предмет несовместимости с текущей версией MySQL Server. Если найденная таблица имеет возможную несовместимость, она проверяется. Если обнаружены какие-либо проблемы, таблица будет восстановлена. mysql_upgrade также обновляет системные таблицы, чтобы вы могли использовать новые привилегии или возможности, которые могли быть добавлены.

  • 3
    спас мою жизнь!!
  • 1
    Спасибо за информацию. Новый для MySQL, действительно сделал мой день. Некоторые ответы классические никогда не умрут :)
Показать ещё 1 комментарий
15

Решение - это всего лишь однострочный запрос, как показано ниже:

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

Замените ROOT своим именем пользователя mysql. Замените PASSWORD своим паролем mysql.

  • 0
    Идеальное и простое решение. Спас мой день.
  • 0
    возможно самое простое решение.
Показать ещё 1 комментарий
14

Выполните следующие действия:

  • Перейдите в PHPMyAdmin
  • Выберите свою базу данных
  • Выберите таблицу
  • В верхнем меню Нажмите "Триггеры"
  • Нажмите "Изменить", чтобы изменить триггер
  • Измените определитель с [user @localhost] на root @localhost

Надеюсь, что это поможет

  • 0
    Ваш комментарий спас мне всю жизнь!
  • 0
    Это реальное решение вопроса, а не создание пользователя и предоставление разрешения. просто измени определитель.
13

Для будущих googlers: у меня есть аналогичное сообщение, пытающееся обновить таблицу в базе данных, которая не содержит представлений. После некоторого копания оказалось, что я импортировал триггеры на эту таблицу, и это были вещи, определенные несуществующим пользователем. Сбрасывание триггеров решило проблему.

  • 0
    Триггеры были проблемой, я обновил определитель в разделе триггеров. больше никаких проблем
  • 0
    Спасибо, это очень полезно. Также необходимо обновить виды.
Показать ещё 1 комментарий
10

Исправлено, выполнив следующие комментарии.

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

если вы получаете some_other вместо web2vi, тогда вы должны соответствующим образом изменить имя.

  • 1
    Спасибо .. это работает для меня ..
  • 1
    Спасибо .... работал как шарм.
6

быстро исправить работу и выгрузить файл:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
  • 0
    почему - единственная транзакция решила проблему?
  • 1
    это не работает. определитель содержится в свалке.
Показать ещё 1 комментарий
6

Пользователь 'web2vi' не существует на вашем сервере mysql.

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

Если этот пользователь существует, проверьте, на каких серверах он может получить доступ, хотя я бы подумал, что это будет другая ошибка (например, у вас может быть web2vi @localhost, но вы получаете доступ к db как web2vi @% (во что угодно )

  • 0
    , Для пользователя «web2vi» не существует на вашем сервере MySQL. + 1. Это спасет мой день ..
4

Попробуйте установить процедуру как SECURITY INVOKER

Mysql default устанавливает безопасность процедур как "DEFINER" (CREATOR OF).. вы должны установить защиту для "invoker".

4

У меня была такая же проблема с пользователем root, и он работал у меня, когда я заменил

root@%

по

root@localhost

Итак, если пользователю 'web2vi' разрешено подключаться из 'localhost', вы можете попробовать:

web2vi@localhost

Я подключен удаленно к базе данных.

  • 0
    спасибо, ты избавил меня от головной боли :)
4

Мои 5 центов.

У меня была такая же ошибка, когда я пытался выбрать из представления.

Однако проблема заключается в том, что это представление, выбранное из другого представления, которое было восстановлено из резервной копии с другого сервера.

и на самом деле, ДА, пользователь был недействителен, но не был очевиден с первого взгляда.

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

Пример:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
  • 0
    Если я предоставлю все привилегии «пользователю» @ «всем ips», то как насчет безопасности ?? !!
  • 0
    @MohsenAbasi Это пример для среды разработки. Этот пользователь может быть системным администратором. Среда разработки должна быть более осторожной.
3

В моем случае таблица имела триггер с пользователем DEFINER, которого не было.

  • 2
    прямо на ногти, особенно когда приложение переносится с сервера на другое
2

Вы можете попробовать следующее:

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

Ваше мнение, "view_quotes", возможно, было скопировано из другой базы данных, где "web2vi" является допустимым пользователем в базе данных, где "web2vi" не является допустимым пользователем.
Либо добавьте пользователя "web2vi" в базу данных, либо измените представление (обычно удаление части DEFINER = 'web2vi' @'%' и выполнение script сделает трюк)

1

Это произошло со мной после того, как я импортировал дамп в Windows 10 с MySQL Workbench 6.3 Community, а "root @% не существует". Хотя пользователь существовал. Сначала я попытался прокомментировать DEFINER, но это не сработало. Затем я заменил строку "root @%" на "root @localhost" и повторно импортировал дамп. Это сделало трюк для меня.

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

... и после каждого из них найдите поле "определитель".

В моем случае это был бородатый старый триггер, который кто-то из разработчиков забыл удалить.

1

когда mysql.proc пуст, но система всегда замечает "[email protected].%" для имени таблицы, нет, вы просто root в командной строке mysql и введите:

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

над

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';
  • 0
    У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'grant all on' mytable '. * для' myuser ', обозначенного' mypass ';' в строке 1
  • 0
    @Cerin, просто измените '' вокруг mytable на ``. Мой ответ направлен на то, чтобы помочь людям с этой проблемой. Подумайте о пересмотре вашего отрицательного мнения.
1

Один или несколько видов, созданных/зарегистрированных другим пользователем. Вам нужно будет проверить владельца представления и:

  • Восстановить пользователя; как говорят другие ответы. или
  • Создайте представления, созданные пользователем 'web2vi', используя ALTER VIEW

У меня была эта проблема.

Я пытался перенести представления из BD1 в BD2, используя SQLYog. SQLYog воссоздал представления в другой базе данных (DB2), но он сохранил пользователя BD1 (они разные). Позже я понял, что представления, которые я использовал в моем запросе, имели ту же ошибку, что и вы, даже когда я не создавал никакого представления.

Надеюсь на эту помощь.

1

Проблема понятна - MySQL не может найти пользователя, заданного в качестве определителя.

Я столкнулся с этой проблемой после синхронизации модели базы данных с сервера разработки, применения ее к localhost, внесения изменений в модель и последующего повторного использования ее на localhost. По-видимому, было определено представление (я изменил), и поэтому я не смог обновить локальную версию.

Как исправить (легко) :

Примечание: он включает удаление, поэтому он отлично подходит для представлений, но убедитесь, что у вас есть резервная копия данных, если вы попробуете это в таблицах.

  • Войдите в базу данных как пользователь root (или все, что имеет достаточную мощность для внесения изменений).
  • Удалить представление, таблицу или все, с чем вы столкнулись.
  • Синхронизируйте свою новую модель - она ​​не будет жаловаться на то, чего не существует сейчас. Вы можете удалить часть SQL SECURITY DEFINER из определения элемента, с которым у вас были проблемы.

P.S. Это не является ни правильным, ни лучшим решением. Я просто разместил его как возможное (и очень простое) решение.

  • 0
    я использую жабу, cn я удаляю и воссоздаю, используя только эту ОС, я должен войти в систему как rooy с терминала, а затем только делать ??
1

У меня была одна и та же проблема минут назад, я столкнулся с этой проблемой после того, как удалил неиспользуемого пользователя из таблицы mysql.user, но вместо этого изменил его вид, вот удобная команда, которая делает ее очень простой:

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

1

Перейдите в раздел подпрограммы редактирования, а внизу измените тип безопасности с Definer на Invoker.

  • 4
    Иди куда? В каком программном обеспечении?
  • 0
    @kenorb, в phpMyAdmin вы можете изменить хранимые подпрограммы MySQL (процедуры и функции), например, тип безопасности.
1

От ссылка MySQL CREATE VIEW:

В предложениях DEFINER и SQL SECURITY указан контекст безопасности, который будет использоваться при проверке прав доступа во время вызова представления.

Этот пользователь должен существовать и всегда лучше использовать "localhost" в качестве имени хоста. Поэтому я думаю, что если вы проверите, что пользователь существует и измените его на "localhost" при создании представления, у вас не будет этой ошибки.

0

Это произошло со мной после перемещения БД с одного сервера на другой. Сначала определитель использовал localhost и пользователя. На новом сервере у нас нет этого пользователя и хоста. Я взял резервную копию этого конкретного стола и удалил все триггеры вручную из phpmyadmin. После этого он отлично работает для меня.

  • 0
    Спасибо за подсказку, я смог вручную удалить все триггеры в MySQL Workbench.
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;
    }

Подсказка: я должен сделать это с pdo из-за проблемы с запросом буфера mysql, описанного здесь

0

Я пришел сюда по той же проблеме, я не смог найти нигде в моем коде, где какой-то пользователь делал это действие. по-видимому, это был из триггера, который использовал пользователя, который был давно удален (db был восстановлен из более старой версии) поэтому, если вы озадачены, как я, взгляните на ваши события/триггеры/подпрограммы. надеюсь, это поможет кому-то.

0

в моем случае у меня был триггер в этой таблице, что я не мог обновлять данные, получая ту же ошибку.

Ошибка MySQL 1449: пользователь, указанный как определитель, не существует

решение заключалось в том, чтобы удалить триггеры в этой таблице и снова создать их снова, это устранило проблему, поскольку триггер был сделан с другим пользователем с другого сервера, а имя пользователя изменилось на новом сервере после изменения компании-хостинга. что мои 2 цента

0

Пользователь базы данных также, похоже, чувствителен к регистру, поэтому, когда у меня был пользователь root @@%, у меня не было пользователя ROOT '@'%. Я изменил пользователя на верхний регистр с помощью инструментария, и проблема была решена!

-1

вы можете создать пользователя с именем web2vi и предоставить все привилегии

-2

Попробуйте следующее:

mysqldump --routines --single-transaction -u root -proot portalv3 > c:\portal.sql
  • 0
    Этот ответ может использовать некоторые объяснения. Что делает это утверждение, в какой среде оно должно выполняться, что оно решает, что должно быть сделано дальше?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню