Błąd MySQL 1449: Użytkownik określony jako moduł definiujący nie istnieje

352

Po uruchomieniu następującego zapytania pojawia się błąd:

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

Komunikat o błędzie to:

#1449 - The user specified as a definer ('web2vi'@'%') does not exist

Dlaczego dostaję ten błąd? Jak to naprawić?

Tech MLG
źródło
7
Pokaż nam swój POKAŻ UTWÓRZ WIDOK 'view_quotes'
jordeu
Błąd musi być w miejscu view_quoteswidoku.
Shell
Po zastanowieniu się przez chwilę i najprostszym działaniem było dodanie brakującego konta do bazy danych, a błąd zniknął. Nie jest wymagana skomplikowana procedura. Jeśli możesz dodać konto, spróbuj najpierw.
user1794918,

Odpowiedzi:

539

Zdarza się to często podczas eksportowania widoków / wyzwalaczy / procedur z jednej bazy danych lub serwera do innej, ponieważ użytkownik, który utworzył ten obiekt, już nie istnieje.

Masz dwie opcje:

1. Zmień DEFINER

Jest to prawdopodobnie najłatwiejsze do wykonania podczas początkowego importowania obiektów bazy danych poprzez usunięcie wszelkich DEFINERinstrukcji ze zrzutu.

Późniejsza zmiana definicji jest nieco trudniejsza:

Jak zmienić definiator widoków

  1. Uruchom ten SQL, aby wygenerować niezbędne instrukcje ALTER

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. Skopiuj i uruchom instrukcje ALTER

Jak zmienić definicję procedur przechowywanych

Przykład:

UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'

Uważaj, ponieważ spowoduje to zmianę wszystkich definicji dla wszystkich baz danych.

2. Utwórz brakującego użytkownika

Jeśli podczas korzystania z bazy danych MySQL wystąpił następujący błąd:

The user specified as a definer ('someuser'@'%') does not exist`

Następnie możesz go rozwiązać za pomocą:

GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password';
FLUSH PRIVILEGES;

From http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

Działa to jak urok - wystarczy zmienić someusernazwę na brakującego użytkownika. Na lokalnym serwerze deweloperskim zwykle możesz po prostu użyć root.

Zastanów się także, czy faktycznie musisz udzielić ALLuprawnień użytkownika, czy może zrobić to mniej.

Chococroc
źródło
1
. i opcja przyznania nie są wymagane.
pomóż
@Simon East: Udało ci się uroczo edytować, bardzo dziękuję za polepszenie odpowiedzi.
Chococroc,
Sugeruję dodanie, zrestartuj instancję mySQL po uruchomieniu zapytania „UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'”, ponieważ wtedy definicje procedur są odświeżane.
John
1
Myślę, że łatwiej jest dodać bezsensownych użytkowników, ponieważ następnym razem, gdy zrobisz dbdump i zaimportujesz go, nie będziesz musiał ponownie edytować widoków / procedur
DarkMukke,
1
Dzięki, właśnie upuściłem tabelę z problemem, usunąłem ją DEFINER=`user`@`host`i ponownie zaimportowałem. Działa jak urok. : ok_hand:
giovannipds
139

Użytkownik, który pierwotnie utworzył widok lub procedurę SQL, został usunięty. Jeśli ponownie utworzysz tego użytkownika, powinien on rozwiązać Twój błąd.

Dave Z Dopson
źródło
3
Ponadto musisz przyznać co najmniej uprawnienia SELECTi EXECUTEuprawnienia dodanemu użytkownikowi. Natknąłem się na to, gdy wyeksportowałem kopię zapasową DB z jednego serwera na inny, gdzie użytkownik, który utworzył procedury, nie istniał na serwerze testowym.
drew010,
5
Dzięki, to było pomocne. Często podczas migracji lub wdrażania przy użyciu mysqldump użytkownik, który utworzył VIEW, TRIGGER lub PROCEDURE (definiator), może nie być taki sam w systemie docelowym. W takim przypadku wystarczy odtworzyć procedurę, uruchomić lub wyświetlić ( DROPa następnie ponownie CREATE) przy użyciu poprawnego użytkownika w systemie docelowym.
Eric Kigathi,
38
możesz również zmienić, kto definiuje, dla istniejącego użytkownika:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
1
Dokładnie w moim przypadku miałem tabelę z wyzwalaczem, która wskazywała na usuniętego użytkownika DEFINER. Aktualizacja użytkownika wyzwalacza rozwiązała problem.
Miguel
Musisz także wyrazić zgodę na tego użytkownika :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor
50

Ten sam błąd wystąpił po aktualizacji mysql.

Błąd został naprawiony po tym poleceniu:

mysql_upgrade -u root

mysql_upgrade powinien być wykonywany przy każdej aktualizacji MySQL. Sprawdza wszystkie tabele we wszystkich bazach danych pod kątem niezgodności z bieżącą wersją serwera MySQL. Jeśli okaże się, że tabela może być niekompatybilna, jest sprawdzana. Jeśli zostaną znalezione jakiekolwiek problemy, tabela zostanie naprawiona. mysql_upgrade aktualizuje także tabele systemowe, abyś mógł skorzystać z nowych uprawnień lub możliwości, które mogły zostać dodane.

artamonovdev
źródło
Nie jestem pewien, dlaczego to nie zadziałało, musiałem ręcznie usunąć wszystkie wyzwalacze w środowisku roboczym mySQL.
user752746,
35

Jeśli użytkownik istnieje, to:

mysql> flush privileges;
BroknDodge
źródło
34

Utwórz usuniętego użytkownika w następujący sposób:

mysql> create user 'web2vi';

lub

mysql> create user 'web2vi'@'%';
Kevin
źródło
3
po utworzeniu tego brakującego użytkownika napotkał kolejny błąd: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'i powinien dodać to polecenie grant all on *.* to 'web2vi'@'%' identified by ''po utworzeniu użytkownika
zhuguowei
31

Wykonaj następujące kroki:

  1. Przejdź do PHPMyAdmin
  2. Wybierz swoją bazę danych
  3. Wybierz swój stół
  4. W górnym menu Kliknij „Wyzwalacze”
  5. Kliknij „Edytuj”, aby edytować wyzwalacz
  6. Zmień definicję z [użytkownik @ localhost] na root @ localhost

Mam nadzieję, że to pomoże

hussainfrotan
źródło
1
Jest to rzeczywiste rozwiązanie pytania, a nie tworzenie uprawnień użytkowników i udzielanie im uprawnień. wystarczy zmienić definicję.
Ankit Chauhan
Czy jest jakiś sposób na znalezienie wszystkich wyzwalaczy w bazie danych?
Mrugesh Mistry,
1
Znajdź wszystkie wyzwalacze: POKAŻ
TRIGGERY
Z wiersza poleceń „pokaż wyzwalacze”, z PhpMyAdmin wybierz bazę danych, a następnie w prawym górnym rogu paska nawigacyjnego kliknij wyzwalacze
hussainfrotan
21

Rozwiązanie to tylko jednowierszowe zapytanie, jak poniżej:

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

Zamień na ROOTswoją nazwę użytkownika mysql. Zastąp PASSWORDswoim hasłem mysql.

Muhammad Azeem
źródło
1
Uwaga: użytkownicy MySQL rozróżniają małe i wielkie litery.
Alessio Cantarella
Musiałem flush privilegespo tym i to działa. Dzięki.
Victor
14

Naprawiono przez uruchomienie następujących komentarzy.

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

jeśli dostajesz some_otherzamiast web2vi, musisz odpowiednio zmienić nazwę.

Selvamani
źródło
13

Dla przyszłych pracowników: dostałem podobny komunikat, próbując zaktualizować tabelę w bazie danych, która nie zawierała żadnych widoków. Po pewnym kopaniu okazało się, że zaimportowałem wyzwalacze do tej tabeli i to były rzeczy zdefiniowane przez nieistniejącego użytkownika. Usunięcie wyzwalaczy rozwiązało problem.

Chris Poirier
źródło
Problemem były wyzwalacze, zaktualizowałem definicję w sekcji wyzwalaczy. nigdy więcej problemów.
Dariusz
Dzięki, to bardzo pomocne. Musisz także zaktualizować widoki.
toxxxa
Rzeczywiście bardzo pomocny :) Nigdy bym tego nie znalazł.
ElChupacabra
7

szybka poprawka umożliwiająca obejście i zrzut pliku:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
Deweloper
źródło
1
to nie działa. Definicja jest zawarta w zrzutu.
phil294
Jeśli używasz mysqlpump z „p” zamiast „d”, możesz użyć --skip-definer
Wouter
@lyhong Nie mam szczegółowego wyjaśnienia, ale najwyraźniej --single-transactionzmienia sposób, w jaki tabele blokady są implementowane podczas zrzutu. Czy jakoś tak. Nie pamiętam, gdzie to przeczytałem, ale to pomogło mi poczuć się „po prostu wrzucając flagę”. Niepokoją mnie również niewyjaśnione odpowiedzi „po prostu zrób to”. Tak czy inaczej, zadziałało w moim przypadku.
SherylHohman
7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

przykład:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
mesutpiskin
źródło
Jeśli przyznam wszystkie uprawnienia „użytkownikowi” @ „wszystkim ips”, to co z bezpieczeństwem ?? !!
Mohsen Abasi,
@MohsenAbasi To jest przykład środowiska programistycznego. Ten użytkownik może być administratorem systemu. Środowisko prod musi być bardziej ostrożne.
mesutpiskin
7

Stało się tak po przeniesieniu bazy danych z jednego serwera na inny serwer. Początkowo program definiujący używał hosta lokalnego i użytkownika. Na nowym serwerze nie mamy tego użytkownika, a host również został zmieniony. Zrobiłem kopię zapasową tej konkretnej tabeli i ręcznie usunąłem wszystkie wyzwalacze z phpmyadmin . Potem wszystko działało dla mnie dobrze.

TS Guhan
źródło
Dzięki za wskazówkę, byłem w stanie ręcznie usunąć wszystkie wyzwalacze w środowisku roboczym mySQL.
user752746,
To był dla mnie problem wyzwalający, musiałem je wszystkie usunąć i odtworzyć
paul.ago
czy istnieje inne rozwiązanie niż odtwarzanie wyzwalaczy? używam zrzutów testowych czasami dwa razy dziennie. zakłóciłoby to moje główne procesy
redestructa
@TS Guhan, czy ponownie dodałeś wyzwalacze po ich ręcznym usunięciu?
MailBlade
6

Miałem ten sam problem z użytkownikiem root, który działał dla mnie po wymianie

root@%

przez

root@localhost

Jeśli więc użytkownik „web2vi” może łączyć się z „localhost”, możesz spróbować:

web2vi@localhost

Jestem połączony zdalnie z bazą danych.

c-toesca
źródło
4

Moje 5 centów.

Miałem ten sam błąd podczas próby wyboru z widoku.

Jednak wydaje się, że problem polega na tym, że ten widok został wybrany z innego widoku, który został przywrócony z kopii zapasowej z innego serwera.

i w rzeczywistości TAK, użytkownik był nieprawidłowy, ale od pierwszego spojrzenia nie był oczywisty.

Nacięcie
źródło
4

Miałem ten sam problem kilka minut temu, napotkałem ten problem po usunięciu nieużywanego użytkownika z tabeli mysql.user, ale naprawienie go zmieniło, oto przydatne polecenie, które czyni to bardzo prostym:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ",
table_name," AS ", view_definition,";") FROM 
information_schema.views WHERE table_schema='databasename'

Wymieszaj to z wierszem poleceń mysql (zakładając, że * nix nie zna systemu Windows):

> echo above_query | mysql -uuser -p > alterView.sql
> mysql -uuser -ppass databasename < alterView.sql

Uwaga: polecenie generuje plik SELECT CONCAT i dodatkowo WYBIERA WKŁAD, co powoduje mysql -uuser -ppass databasename < alterView.sqlniepowodzenie, jeśli go nie usuniesz.

Źródło: /dba/4129/modify-definer-on-many-views

Ziul
źródło
4

Spróbuj ustawić procedurę jako SECURITY INVOKER

Domyślnie Mysql ustawia bezpieczeństwo procedur jako „DEFINER” (TWÓRCA) .. musisz ustawić bezpieczeństwo na „wywoływacza”.

Allan Felipe Murara
źródło
3

Twój widok „view_quotes” mógł zostać skopiowany z innej bazy danych, w której „web2vi” jest prawidłowym użytkownikiem, do bazy danych, w której „web2vi” nie jest prawidłowym użytkownikiem.
Dodaj użytkownika „web2vi” do bazy danych lub zmień widok (zwykle usunięcie części DEFINER = 'web2vi' @ '%' i wykonanie skryptu załatwi sprawę)

użytkownik1016736
źródło
3

W moim przypadku tabela miała wyzwalacz z użytkownikiem DEFINER, który nie istniał.

jbaylina
źródło
2
tuż przy gwoździu, zwłaszcza gdy aplikacja jest przenoszona z serwera na inny
zardilior,
2

Od MySQL odniesieniu do CREATE VIEW:

Klauzule DEFINER i SQL SECURITY określają kontekst bezpieczeństwa, który ma być używany podczas sprawdzania uprawnień dostępu w czasie wywołania widoku.

Ten użytkownik musi istnieć i zawsze lepiej używać „localhost” jako nazwy hosta. Myślę więc, że jeśli sprawdzisz, czy użytkownik istnieje i zmienisz go na „localhost” w widoku tworzenia, nie będziesz miał tego błędu.

jordeu
źródło
2

Problem jest jasny - MySQL nie może znaleźć użytkownika określonego jako definiującego.

Ten problem napotkałem po zsynchronizowaniu modelu bazy danych z serwera programistycznego, zastosowaniu go do localhost, wprowadzeniu zmian w modelu, a następnie ponownym zastosowaniu go do localhost. Najwyraźniej zdefiniowano widok (zmodyfikowałem), więc nie mogłem zaktualizować mojej wersji lokalnej.

Jak to naprawić (łatwo) :

Uwaga: wymaga usunięcia, więc działa dobrze dla widoków, ale upewnij się, że masz kopię zapasową danych, jeśli spróbujesz tego na tabelach.

  1. Zaloguj się do bazy danych jako root (lub cokolwiek, co ma wystarczającą moc, aby wprowadzić zmiany).
  2. Usuń widok, tabelę lub cokolwiek, z czym masz problem.
  3. Zsynchronizuj swój nowy model - nie będzie narzekać na coś, co teraz nie istnieje. Możesz usunąć część DEFINER BEZPIECZEŃSTWA SQL z definicji elementu, z którą miałeś problemy.

PS To nie jest ani poprawne, ani najlepsze rozwiązanie. Właśnie opublikowałem to jako możliwe (i bardzo proste) rozwiązanie.

Pijusn
źródło
używam ropuchy, cn, usuwam i odtwarzam ponownie, używając tylko tego systemu operacyjnego. Powinienem zalogować się jako rooy z terminala, a potem zrobić tylko?
Vasanth Nag KV
2

Możesz spróbować:

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;
Sukamdani Barli
źródło
2

Dlaczego dostaję ten błąd? Jak to naprawić?

Spędziłem godzinę, zanim znalazłem decyzję dotyczącą takiego problemu. Ale w moim przypadku uruchomiłem to:

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2;
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Jeśli naprawdę chcesz znaleźć problem, po prostu uruchom następujące polecenia:

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

... i po każdym z nich poszukaj pola „definiator”.

W moim przypadku był to brodaty stary wyzwalacz, który ktoś z programistów zapomniał usunąć.

kivagant
źródło
1

Przejdź do sekcji edycji i na dole zmień typ zabezpieczeń z Definer na Invoker.

użytkownik1174436
źródło
4
Iść gdzieś? W jakim oprogramowaniu?
kenorb
@kenorb, w phpMyAdmin możesz zmienić procedury przechowywane w MySQL (procedury i funkcje), np. Typ bezpieczeństwa.
Mikl
1

Jeden lub kilka twoich widoków zostało utworzonych / zarejestrowanych przez innego użytkownika. Musisz sprawdzić właściciela widoku i:

  1. Odtwórz użytkownika; jak mówią inne odpowiedzi. lub
  2. Odtwórz widoki utworzone przez użytkownika 'web2vi'za pomocą ALTER VIEW

Raz miałem ten problem.

Próbowałem migrować widoki z BD1 na BD2 przy użyciu SQLYog. SQLYog odtworzył widoki w innej bazie danych (DB2), ale zachował użytkownika BD1 (gdzie były inne). Później zdałem sobie sprawę, że widoki, których użyłem w swoim zapytaniu, zawierały ten sam błąd co Ty, nawet gdy nie tworzyłem żadnego widoku.

Mam nadzieję, że to pomoże.

Julio Indriago
źródło
1

Jeśli jest to procedura składowana, możesz wykonać:

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

Ale nie jest to zalecane.

Dla mnie lepszym rozwiązaniem jest utworzenie definicji:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
pomagać
źródło
Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, czy jest odpowiednia składnia do użycia w pobliżu „grant all on„ mytable ”. * do„ myuser ”identyfikowanego przez„ mypass ”; w linii 1
Cerin
@Cerin, wystarczy zmienić '' wokół mytable na ``. Moja odpowiedź ma na celu pomóc ludziom z tym problemem. Pomyśl o ponownym rozważeniu swojego zdania negatywnego.
Pomóż
1

gdy mysql.proc jest pusty, ale system zawsze zauważa „uż[email protected].%” dla nazwy_tabeli nie istnieje, wystarczy zrootować w linii poleceń mysql i wpisać:

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

nad!

zhi.yang
źródło
1

Zdarzyło mi się to po zaimportowaniu zrzutu do systemu Windows 10 ze społecznością MYSQL Workbench 6.3 z „root @% nie istnieje”. Mimo że użytkownik istniał. Najpierw próbowałem skomentować DEFINER, jednak to nie zadziałało. I wtedy nie ciąg zastąpić na „root @%” z „root @ localhost” i ponownie przywiezione zrzutu. To załatwiło sprawę.

Dévan Coetzee
źródło
0

Wygląda na to, że użytkownik bazy danych rozróżnia małe i wielkie litery, więc chociaż miałem root „@”% użytkownika, nie miałem ROOT „@”% użytkownika. Zmieniłem użytkownika na wielkie litery za pomocą środowiska roboczego i problem został rozwiązany!

Metalmania
źródło