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ć?
mysql
permissions
Tech MLG
źródło
źródło
view_quotes
widoku.Odpowiedzi:
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
DEFINER
instrukcji ze zrzutu.Późniejsza zmiana definicji jest nieco trudniejsza:
Jak zmienić definiator widoków
Uruchom ten SQL, aby wygenerować niezbędne instrukcje ALTER
Skopiuj i uruchom instrukcje ALTER
Jak zmienić definicję procedur przechowywanych
Przykład:
Uważaj, ponieważ spowoduje to zmianę wszystkich definicji dla wszystkich baz danych.
2. Utwórz brakującego użytkownika
From http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html
Działa to jak urok - wystarczy zmienić
someuser
nazwę 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ć
ALL
uprawnień użytkownika, czy może zrobić to mniej.źródło
mysql
.proc
P SET definer = 'user @%' WHERE definer = 'root @%'”, ponieważ wtedy definicje procedur są odświeżane.DEFINER=`user`@`host`
i ponownie zaimportowałem. Działa jak urok. : ok_hand: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.
źródło
SELECT
iEXECUTE
uprawnienia 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.DROP
a następnie ponownieCREATE
) przy użyciu poprawnego użytkownika w systemie docelowym.UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Ten sam błąd wystąpił po aktualizacji mysql.
Błąd został naprawiony po tym poleceniu:
źródło
Jeśli użytkownik istnieje, to:
źródło
Utwórz usuniętego użytkownika w następujący sposób:
lub
źródło
ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'
i powinien dodać to poleceniegrant all on *.* to 'web2vi'@'%' identified by ''
po utworzeniu użytkownikaWykonaj następujące kroki:
Mam nadzieję, że to pomoże
źródło
Rozwiązanie to tylko jednowierszowe zapytanie, jak poniżej:
Zamień na
ROOT
swoją nazwę użytkownika mysql. ZastąpPASSWORD
swoim hasłem mysql.źródło
flush privileges
po tym i to działa. Dzięki.Naprawiono przez uruchomienie następujących komentarzy.
jeśli dostajesz
some_other
zamiastweb2vi
, musisz odpowiednio zmienić nazwę.źródło
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.
źródło
Użytkownik „web2vi” nie istnieje na twoim serwerze mysql.
Zobacz http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user
Jeśli ten użytkownik istnieje, sprawdź, z których serwerów może uzyskać dostęp, chociaż pomyślałem, że byłby to inny błąd (np. Możesz mieć web2vi @ localhost, ale uzyskujesz dostęp do bazy danych jako web2vi @% (cokolwiek)
źródło
szybka poprawka umożliwiająca obejście i zrzut pliku:
źródło
--single-transaction
zmienia 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.przykład:
źródło
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.
źródło
Miałem ten sam problem z użytkownikiem root, który działał dla mnie po wymianie
przez
Jeśli więc użytkownik „web2vi” może łączyć się z „localhost”, możesz spróbować:
Jestem połączony zdalnie z bazą danych.
źródło
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.
źródło
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:
Wymieszaj to z wierszem poleceń mysql (zakładając, że * nix nie zna systemu Windows):
Uwaga: polecenie generuje plik SELECT CONCAT i dodatkowo WYBIERA WKŁAD, co powoduje
mysql -uuser -ppass databasename < alterView.sql
niepowodzenie, jeśli go nie usuniesz.Źródło: /dba/4129/modify-definer-on-many-views
źródło
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”.
źródło
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ę)
źródło
W moim przypadku tabela miała wyzwalacz z użytkownikiem DEFINER, który nie istniał.
źródło
Od MySQL odniesieniu do
CREATE VIEW
: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.
źródło
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.
PS To nie jest ani poprawne, ani najlepsze rozwiązanie. Właśnie opublikowałem to jako możliwe (i bardzo proste) rozwiązanie.
źródło
Możesz spróbować:
źródło
Spędziłem godzinę, zanim znalazłem decyzję dotyczącą takiego problemu. Ale w moim przypadku uruchomiłem to:
Jeśli naprawdę chcesz znaleźć problem, po prostu uruchom następujące polecenia:
... 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ąć.
źródło
Przejdź do sekcji edycji i na dole zmień typ zabezpieczeń z Definer na Invoker.
źródło
Jeden lub kilka twoich widoków zostało utworzonych / zarejestrowanych przez innego użytkownika. Musisz sprawdzić właściciela widoku i:
'web2vi'
za pomocą ALTER VIEWRaz 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.
źródło
Jeśli jest to procedura składowana, możesz wykonać:
Ale nie jest to zalecane.
Dla mnie lepszym rozwiązaniem jest utworzenie definicji:
źródło
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ć:
nad!
źródło
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ę.
źródło
Spróbuj tego To proste rozwiązanie
więcej na https://stackoverflow.com/a/42183702/5407056
źródło
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!
źródło