Ошибка 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
Почему я получаю эту ошибку? Как мне это исправить?
41 ответ
Это обычно происходит при экспорте представлений / триггеров / процедур из одной базы данных или сервера на другой, поскольку пользователь, создавший этот объект, больше не существует.
У вас есть два варианта:
1. Измените ОПРЕДЕЛИТЕЛЬ
Возможно, это проще всего сделать при первоначальном импорте объектов базы данных, удалив любые 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
разрешения или могут ли они сделать с меньшими затратами.
The user who originally created the SQL view or procedure has been deleted. Если вы воссоздаете этого пользователя, он должен устранить вашу ошибку.
Следуй этим шагам:
- Перейти к PHPMyAdmin
- Выберите вашу базу данных
- Выберите стол
- В верхнем меню нажмите "Триггеры"
- Нажмите "Изменить", чтобы редактировать триггер
- Изменить определитель с [user@localhost] на root@localhost
Надеюсь, поможет
Я получил ту же ошибку после обновления MySQL.
Ошибка была исправлена после этой команды:
mysql_upgrade -u root
mysql_upgrade должен выполняться каждый раз, когда вы обновляете MySQL. Он проверяет все таблицы во всех базах данных на несовместимость с текущей версией MySQL Server. Если в таблице обнаружена возможная несовместимость, она проверяется. Если какие-либо проблемы обнаружены, таблица ремонтируется. mysql_upgrade также обновляет системные таблицы, чтобы вы могли воспользоваться новыми привилегиями или возможностями, которые могли быть добавлены.
Создайте удаленного пользователя следующим образом:
mysql> create user 'web2vi';
или же
mysql> create user 'web2vi'@'%';
Решение - это просто однострочный запрос, как показано ниже:
grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;
замещать ROOT
с вашим именем пользователя mysql. замещать PASSWORD
с вашим паролем mysql.
Исправлено с помощью следующих комментариев.
grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;
если вы получаете some_other
вместо web2vi
тогда вы должны изменить имя соответственно.
Для будущих Google: я получил похожее сообщение, пытаясь обновить таблицу в базе данных, которая не содержала просмотров. После некоторых копаний оказалось, что я импортировал триггеры в эту таблицу, и это были вещи, определенные несуществующим пользователем. Сброс триггеров решил проблему.
Быстрое решение, чтобы обойти и сбросить файл:
mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
grant all on *.* to 'username'@'%' identified by 'password' with grant option;
пример:
grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
У меня была та же проблема с пользователем root, и она работала для меня, когда я заменил
root@%
от
root@localhost
Итак, если пользователю "web2vi" разрешено подключаться с "localhost", вы можете попробовать:
web2vi@localhost
Я удаленно подключен к базе данных.
Пользователь 'web2vi' не существует на вашем сервере MySQL.
См. http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html
Если этот пользователь существует, проверьте, с каких серверов он может получить доступ, хотя я бы подумал, что это будет другой ошибкой (например, у вас может быть web2vi @ localhost, но вы обращаетесь к БД как web2vi@% (при любом)
Почему я получаю эту ошибку? Как мне это исправить?
Я потратил час, прежде чем нашел решение такой проблемы. Но, в моем случае, я запустил это:
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';
... и после каждого из них ищите поле "определитель".
В моем случае это был старый бородатый триггер, который кто-то из разработчиков забыл удалить.
Это случилось со мной после перемещения БД с одного сервера на другой. Первоначально определитель использовал localhost и пользователя. На новом сервере у нас нет этого пользователя, и хост также был изменен. Я взял резервную копию этой таблицы и удалил все триггеры вручную из phpmyadmin. После этого он работает нормально для меня.
Попробуйте установить вашу процедуру как SECURITY INVOKER
Mysql по умолчанию устанавливает безопасность процедур как "DEFINER" (CREATOR OF). Вы должны установить безопасность для "invoker".
У меня была та же самая проблема несколько минут назад, я столкнулся с этой проблемой после удаления неиспользуемого пользователя из таблицы 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
не удастся, если вы не удалите его.
Источник: https://dba.stackexchange.com/questions/4129/modify-definer-on-many-views
Вы можете изменить определителя для конкретной базы данных на существующего пользователя:
UPDATE mysql.proc SET definer = 'existing_user@localhost' WHERE db = 'database_name';
Мои 5 центов.
У меня была та же ошибка, когда я пытался выбрать из вида.
Однако проблема заключается в том, что это представление выбрано из другого представления, которое было восстановлено из резервной копии с другого сервера.
и фактически, ДА, пользователь был недействителен, но не было очевидно, куда с первого взгляда.
По вашему мнению, "view_quotes" может быть скопировано из другой базы данных, где "web2vi" является действительным пользователем, в базу данных, где "web2vi" не является действительным пользователем.
Либо добавьте пользователя "web2vi" в базу данных, либо измените представление (обычно удаляя часть DEFINER='web2vi'@'%' и выполняя сценарий, вы добьетесь цели)
В моем случае в таблице был триггер с пользователем DEFINER, которого не было.
Проблема ясна - MySQL не может найти пользователя, указанного как определитель.
Я столкнулся с этой проблемой после синхронизации модели базы данных с сервера разработки, применения ее к localhost, внесения изменений в модель и последующего применения ее к localhost. Очевидно, было определено представление (я изменил), и поэтому я не мог обновить свою локальную версию.
Как исправить (легко):
Примечание: он включает в себя удаление, поэтому он отлично работает для представлений, но убедитесь, что у вас есть резервная копия данных, если вы попробуете это для таблиц.
- Войдите в базу данных с правами суперпользователя (или что-то еще, что достаточно для внесения изменений)
- Удалите вид, таблицу или все, что у вас возникли проблемы.
- Синхронизируйте свою новую модель - она не будет жаловаться на то, чего сейчас не существует. Вы можете удалить часть SQL SECURITY DEFINER из определения элемента, с которым у вас были проблемы.
PS Это не правильное и не лучшее решение. Я только что опубликовал это как возможное (и очень простое) решение.
Из MySQL ссылка на CREATE VIEW
:
Предложения DEFINER и SQL SECURITY задают контекст безопасности, который будет использоваться при проверке прав доступа во время вызова представления.
Этот пользователь должен существовать и всегда лучше использовать localhost в качестве имени хоста. Поэтому я думаю, что если вы проверите, что пользователь существует, и измените его на "localhost" при создании представления, у вас не будет этой ошибки.
Для меня удаление
''
из DEFINER сделали свое дело.
DEFINER = user@localhost
Попробуйте следующее:
mysqldump --routines --single-transaction -u root -proot portalv3 > c:\portal.sql
Вы можете попробовать это:
$ mysql -u root -p
> grant all privileges on *.* to `root`@`%` identified by 'password';
> flush privileges;
Когда mysql.proc пуст, но система всегда замечает "user@192.168.%" для table_name не существует, вы просто получаете root в командной строке mysql и набираете:
CHECK TABLE `database`.`table_name` QUICK FAST MEDIUM CHANGED;
flush privileges;
над!
В моем случае у меня был триггер на эту таблицу, который я не мог обновить данные, получая ту же ошибку.
Ошибка MySQL 1449: пользователь, указанный как определитель, не существует
решение состояло в том, чтобы удалить триггеры в этой таблице и воссоздать их снова, это решило проблему, поскольку триггер был выполнен с другим пользователем с другого сервера, а имя пользователя изменилось на новом сервере после смены хостинговой компании. это мои 2 цента
Если это хранимая процедура, вы можете сделать:
UPDATE `mysql`.`proc` SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'
Но это не рекомендуется.
Для меня лучшее решение - создать определитель:
create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
Я пришел сюда по той же проблеме, я не мог найти в моем коде нигде, где какой-то пользователь выполнял действие. по-видимому, это было от триггера, который использовал пользователя, которого долго удаляли (БД была восстановлена из более старой версии), поэтому, если вы озадачены, как я, посмотрите на ваши события / триггеры / процедуры БД. надеюсь, это кому-нибудь поможет.