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

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

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 

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

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

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

1. Измените ОПРЕДЕЛЕНИЕ

Это, возможно, проще всего сделать при первоначальном импорте объектов базы данных, удалив любые инструкции DEFINER из дампа.

Позднее изменение определителя является более сложным:

Как изменить определитель для просмотров

  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

Как изменить определитель для хранимых процедур

Пример:

 UPDATE `mysql`.`proc` p SET definer = '[email protected]%' WHERE definer='[email protected]%' 

Будьте осторожны, потому что это изменит все определители для всех баз данных.

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

Это работало как шарм – вам нужно только изменить имя пользователя на имя пропавшего пользователя. На локальном сервере-разработчике обычно можно использовать root .

Также подумайте над тем, действительно ли вам нужно предоставить пользователям ALL разрешения или же они могут делать меньше.

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

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

 mysql> flush privileges; 

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

 mysql> create user 'web2vi'; 

или

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

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

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

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

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

Следуй этим шагам:

  1. Перейти к PHPMyAdmin
  2. Выберите свою базу данных
  3. Выберите таблицу
  4. В верхнем меню Нажмите «Триггеры»,
  5. Нажмите «Изменить», чтобы отредактировать триггер
  6. Измените определитель с [user @ localhost] на root @ localhost

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

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

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

 mysql_upgrade -u root 

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

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

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

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

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

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

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

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

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

Мои 5 центов.

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

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

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

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

 [email protected]% 

от

 [email protected] 

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

 [email protected] 

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

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

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

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

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

пример:

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

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

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

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

Из ссылки MySQL CREATE VIEW :

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

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

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

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

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

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

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

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

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

У меня была одна и та же проблема минут назад, я столкнулся с этой проблемой после удаления неиспользуемого пользователя из таблицы 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 

Примечание: команда генерирует и 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. Восстановить пользователя; как говорят другие ответы. или
  2. 'web2vi' представления, которые создаются пользователем 'web2vi' используя ALTER VIEW

Однажды у меня была эта проблема.

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

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

Если это хранимая процедура, вы можете сделать:

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

Но это не рекомендуется.

Для меня лучшим решением является создание определителя:

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

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

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

над!

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

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

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

… и, после каждого из них, найдите поле «определитель».

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

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

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

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

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

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

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

  • Android-разрешение не работает, даже если я его объявил
  • Разрешения IIS_IUSRS и IUSR в IIS8
  • adb remount разрешено, но доступно для доступа к суперпользователю в shell-android
  • SYSTEM_ALERT_WINDOW - как получить это разрешение автоматически на Android 6.0 и targetSdkVersion 23
  • Обзор разрешений IIS7 - ApplicationPoolIdentity
  • проблема с правами на запись файла в папку «Program Files»
  • Как я могу получить страшные разрешения WRITE_SECURE_SETTINGS для моего приложения для Android?
  • Правильный владелец / группа / разрешения для файлов / папок сайта Apache 2 в Mac OS X?
  • Список разрешений Android для обычных разрешений и опасных разрешений в API 23?
  • Последнее обновление по включению и отключению мобильных данных программно
  • Веб-просмотр Android: загрузка файлов, таких как браузеры
  • Давайте будем гением компьютера.