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

354

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

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

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

Tech MLG
источник
7
Покажите нам свое ШОУ, СОЗДАЙТЕ ВИД 'view_quotes'
jordeu
Ошибка должна быть в том месте, где view_quotesвид.
Shell
Подумав об этом мгновение, самым простым способом было добавить отсутствующую учетную запись в базу данных, и ошибка исчезла. Никаких сложных процедур не требуется. Если вы можете добавить учетную запись, попробуйте сначала.
user1794918

Ответы:

540

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

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

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 = '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разрешения пользователям или они могут делать с меньшими затратами.

Chococroc
источник
1
, и вариант предоставления не требуются.
helpse
@Simon East: Вы сделали прекрасное редактирование, большое спасибо за улучшение ответа.
Chococroc
Я предлагаю добавить, перезапустить экземпляр mySQL после выполнения запроса «UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'", поскольку определители процедур обновляются только тогда.
Йохан
1
Я думаю, что проще добавить бессмысленных пользователей, потому что в следующий раз, когда вы сделаете dbdump и импортируете его, вам не нужно будет снова редактировать представления / процедуры
DarkMukke
1
Спасибо, я только что уронил таблицу с проблемой, удалил DEFINER=`user`@`host`и повторно импортировал ее. Работал как шарм. : ok_hand:
giovannipds
139

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

Дейв Z Допсон
источник
3
Кроме того , вы должны будете предоставить , по крайней мере SELECTи EXECUTEпривилегии для добавленного пользователя. Я столкнулся с этим, когда экспортировал резервную копию БД с одного сервера на другой, где пользователь, создавший подпрограммы, не существовал на тестовом сервере.
drew010
5
Спасибо, это было полезно. Часто при миграции или развертывании с использованием mysqldump пользователь, создавший VIEW, TRIGGER или PROCEDURE (определитель), может не совпадать в целевой системе. В этом случае достаточно просто воссоздать процедуру, запустить или просмотреть ( DROPзатем повторно CREATE) с использованием действительного пользователя в целевой системе.
Эрик Кигати
38
Вы также можете изменить того, кто определен для существующего пользователя:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
1
Именно в моем случае у меня была таблица с триггером, который указывал на удаленного пользователя DEFINER. Обновление триггера пользователя решило проблему.
Мигель
Вы также должны дать разрешение этому пользователю :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor
50

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

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

mysql_upgrade -u root

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

artamonovdev
источник
Не уверен, почему это не работает для меня, мне пришлось вручную удалить все триггеры в MySQL Workbench.
user752746
35

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

mysql> flush privileges;
BroknDodge
источник
34

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

mysql> create user 'web2vi';

или

mysql> create user 'web2vi'@'%';
Kevin
источник
3
после создания, что пропустил пользователя, обнаружил еще одну ошибку: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'и должен добавить эту команду grant all on *.* to 'web2vi'@'%' identified by ''после создания пользователя
zhuguowei
31

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

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

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

hussainfrotan
источник
1
Это реальное решение вопроса, а не создание пользователя и предоставление разрешения. просто измени определитель.
Анкит Чаухан,
Есть ли способ найти все триггеры в базе данных?
Мружеш Мисти
1
Найти все триггеры: ПОКАЗАТЬ
ТРИГГЕРС
Из командной строки 'show triggerss', из PhpMyAdmin выберите базу данных, а затем в правом верхнем углу панели навигации нажмите на триггеры
hussainfrotan
21

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

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

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

Мухаммед Азим
источник
1
Будьте осторожны: пользователи MySQL чувствительны к регистру.
Алессио Кантарелла
Мне нужно было flush privilegesпосле этого, и это работает. Спасибо.
Виктор
14

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

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

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

Selvamani
источник
13

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

Крис Пуарье
источник
Триггеры были проблемой, я обновил определитель в разделе триггеров. больше никаких проблем
Дарий
Спасибо, это очень полезно. Также необходимо обновить виды.
Toxxxa
Действительно очень полезно :) Я бы никогда не нашел это в одиночестве.
ElChupacabra
7

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

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

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

cosmorogers
источник
7

быстрое решение, чтобы обойти и сбросить файл:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
разработчик
источник
1
это не работает. определитель содержится в свалке.
phil294
Если вы используете mysqlpump с «p» вместо «d», вы можете использовать --skip-definer
Wouter
@lyhong У меня нет подробного объяснения, но, видимо, --single-transactionменяется способ реализации таблиц блокировок во время дампа. Или что-то типа того. Я не помню, где я читал это, но это помогло мне чувствовать себя комфортно с «просто бросить флаг». Я также обеспокоен необъяснимыми «просто делай это» «ответами». В любом случае, это сработало для моего случая.
Шерил Хохман
7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

пример:

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

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

Т.С. Гухан
источник
Спасибо за совет, я смог вручную удалить все триггеры в MySQL Workbench.
user752746
Для меня это действительно было триггерной проблемой, мне пришлось удалить и воссоздать их все
paul.ago
Есть ли другое решение, кроме воссоздания триггеров? Я использую тестовые свалки иногда два раза в день. это нарушило бы мои основные процессы
redestructa
@ TS Гухан, вы повторно добавили триггеры после того, как удалили их вручную?
MailBlade
6

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

root@%

по

root@localhost

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

web2vi@localhost

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

с-toesca
источник
4

Мои 5 центов.

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

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

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

Ник
источник
4

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

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сбою, если вы не удалите его.

Источник: /dba/4129/modify-definer-on-many-views

Ziul
источник
4

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

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

Аллан Фелипе Мурара
источник
3

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

user1016736
источник
3

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

jbaylina
источник
2
особенно, когда приложение переносится с одного сервера на другой
zardilior
2

Из MySQL ссылка на CREATE VIEW:

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

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

jordeu
источник
2

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

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

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

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

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

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

Pijusn
источник
я использую жабу, cn я удаляю и воссоздаю, используя только эту ОС, я должен войти в систему как rooy с терминала, а затем только делать ??
Vasanth Nag KV
2

Вы можете попробовать это:

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;
Сукамдани Барли
источник
2

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

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

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

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

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

kivagant
источник
1

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

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

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

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

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

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

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

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

когда mysql.proc пуст, но система всегда замечает «user@192.168.%» для table_name не существует, вы просто root в командной строке mysql и введите:

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

над!

zhi.yang
источник
1

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

Деван Кутзи
источник
0

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

Metalmania
источник