Ошибка 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

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


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


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


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


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


34

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

mysql> create user 'web2vi';

или

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

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

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


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, чтобы изменить имя, соответственно.


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 @% (при любом)


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;

Если я предоставлю все привилегии «пользователю» @ «всем ips», то как насчет безопасности ?? !!
Мохсен Абаси

@MohsenAbasi Это пример для среды разработки. Этот пользователь может быть системным администратором. Среда разработки должна быть более осторожной.
mesutpiskin

7

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


Спасибо за совет, я смог вручную удалить все триггеры в MySQL Workbench.
user752746

Для меня это действительно было триггерной проблемой, мне пришлось удалить и воссоздать их все
paul.ago

Есть ли другое решение, кроме воссоздания триггеров? Я использую тестовые свалки иногда два раза в день. это нарушило бы мои основные процессы
redestructa

@ TS Гухан, вы повторно добавили триггеры после того, как удалили их вручную?
MailBlade

6

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

root@%

по

root@localhost

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

web2vi@localhost

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


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


4

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

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


3

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


3

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


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

2

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

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

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


2

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

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

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

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

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

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


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


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

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

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


1

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


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

У вас есть ошибка в вашем синтаксисе 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;

над!


1

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



0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.