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ć?


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.


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.


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.


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


34

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

mysql> create user 'web2vi';

lub

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

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


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.


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ę.


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.


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

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;

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.


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.


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.


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


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”.


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ę)


3

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


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.


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.


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;

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ąć.


1

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


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.


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

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żytkownik@192.168.%” 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!


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ę.



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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.