Помилка MySQL 1449: користувача, визначеного як визначений, не існує


352

Коли я запускаю такий запит, я отримую помилку:

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перегляд стану.
Шелл

Замислившись над цим моментом, найпростішим способом дій було додати відсутній обліковий запис до бази даних, і помилка усунулася. Не потрібна складна процедура. Якщо ви можете додати обліковий запис, спробуйте це спочатку.
користувач1794918

Відповіді:


539

Це зазвичай відбувається при експорті представлень / тригерів / процедур з однієї бази даних або сервера до іншої, оскільки користувача, який створив цей об'єкт, більше не існує.

У вас є два варіанти:

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 @%'", оскільки дефінітори процедур оновлюються лише тоді.
johan

1
Я думаю, що простіше додати безглуздих користувачів, оскільки наступного разу, коли ви зробите dbdump та імпортуєте його, вам не доведеться повторно редагувати перегляди / процедури
DarkMukke

1
Дякую, щойно я скинув таблицю з проблемою, видалив DEFINER=`user`@`host`та повторно імпортував її. Працював як шарм. : ok_hand:
giovannipds

139

Користувача, який створив подання або процедуру SQL, було видалено. Якщо ви відтворили цього користувача, він повинен вирішити вашу помилку.


3
Крім того, вам потрібно буде надати щонайменше SELECTта EXECUTEпривілеї доданому користувачеві. Я зіткнувся з цим, коли експортував резервну копію БД з одного сервера на інший, де на тестовому сервері не існувало користувача, який створив підпрограми.
намалював010,

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.
користувач752746


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
Це фактичне рішення питання, а не створення дозволу користувача та надання дозволу. просто змініть дефінір.
Анкіт Чаухан

Чи є спосіб знайти всі тригери в базі даних?
Mrugesh Mistry

1
Знайти всі тригери: SHOW TRIGGERS
JerzySkalski

У командному рядку "показати тригер", з 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

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


Проблема була тригерами, я оновив дефінітор у розділі тригерів. більше жодних питань.
Дарій

Дякую, це дуже корисно. Також потрібно оновити представлення даних.
toxxxa

Дійсно дуже корисно :) Я ніколи цього не знайду.
ElChupacabra

7

Користувача 'web2vi' не існує на вашому сервері mysql.

Дивіться http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user

Якщо цей користувач існує, перевірте, до яких серверів він може отримати доступ, хоча я б подумав, що це буде інша помилка (EG, можливо, у вас є web2vi @ localhost, але ви отримуєте доступ до db як 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змінюється спосіб реалізації таблиць блокування під час демпінгу. Або щось подібне. Я не пам'ятаю, де я це читав, але це допомогло мені почувати себе комфортно, "просто кинувши прапор". Мені також непокоїть незрозумілі відповіді "просто роби це". Так чи інакше, це працювало для моєї справи.
SherylHohman

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.
користувач752746

Це справді було проблемою для мене, я повинен був їх видалити і відтворити все
paul.ago

чи є якесь інше рішення, ніж відтворення тригерів? Я використовую тест-відвали іноді двічі на день. це
зірве

@TS Guhan Ви повторно додали тригери після того, як ви видалили їх вручну?
MailBlade

6

У мене була така ж проблема з користувачем root і ans працювала на мене, коли я замінив

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

Примітка: команда генерує та додатково вибирає файл CONCAT у файлі, роблячи помилку, mysql -uuser -ppass databasename < alterView.sqlякщо не видалити її.

Джерело: /dba/4129/modify-definer-on-many-views


4

Спробуйте встановити свою процедуру як SECURITY INVOKER

Mysql за замовчуванням встановлює захист процедур як "DEFINER" (СТВОРИТЕЛЬ).


3

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


3

У моєму випадку таблиця мала тригер із користувачем DEFINER, який не існував.


2
прямо на цвяху, особливо коли додаток перенесено з іншого сервера
zardilior

2

З посилання на MySQLCREATE 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

Зайдіть у розділ розпорядження редагування та, внизу, змініть Тип безпеки з «Визначний» на «Інвойкер».


4
Йти куди? У якому програмному забезпеченні?
kenorb

@kenorb, в phpMyAdmin ви можете змінити збережені процедури MySQL (процедури та функції), наприклад Тип безпеки.
Мікл

1

Одне або кілька ваших переглядів, де створено / зареєстровано іншим користувачем. Вам доведеться перевірити власника виду та:

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

У мене була така проблема колись.

Я намагався перенести перегляди, з BD1 на BD2, використовуючи SQLYog. SQLYog відтворив представлення даних в іншій DataBase (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, чи правильно використовувати синтаксис для використання поруч із „дозволити всім на„ mytable “. * до„ myuser “, визначеним„ mypass “; ' на лінії 1
Серін

@ Cerin, просто зміни "" навколо mytable на "`. Моя відповідь має на меті допомогти людям з цією проблемою .. Подумайте про перегляд свого голосового голосу ..
helpse

1

коли mysql.proc порожній, але система завжди помічає "user@192.168.%" для table_name не існує, ви просто викоріньте командний рядок mysql та введіть:

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

закінчився!


1

Це сталося зі мною після того, як я імпортував дамп у Windows 10 із спільнотою MYSQL Workbench 6.3, з "root @% не існує". Незважаючи на те, що користувач існував. Спочатку я спробував прокоментувати DEFINER, однак це не вийшло. Потім я замінив рядок на "root @%" на "root @ localhost" і повторно імпортував дамп. Це зробило для мене трюк.



0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.