Kesalahan MySQL 1449: Pengguna yang ditentukan sebagai definisi tidak ada

353

Ketika saya menjalankan kueri berikut, saya mendapatkan kesalahan:

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

Pesan kesalahan adalah:

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

Mengapa saya mendapatkan kesalahan itu? Bagaimana saya memperbaikinya?

MLG teknologi
sumber
7
Tunjukkan pada kami SHOW CREATE VIEW 'view_quotes'
jordeu
Kesalahan harus di mana kondisi view_quotestampilan.
Shell
Setelah memikirkan hal ini sejenak dan tindakan yang paling sederhana adalah menambahkan akun yang hilang ke database dan kesalahan hilang. Tidak diperlukan prosedur yang rumit. Jika Anda dapat menambahkan akun maka coba dulu.
user1794918

Jawaban:

540

Ini biasanya terjadi ketika mengekspor tampilan / pemicu / prosedur dari satu basis data atau server ke yang lain karena pengguna yang membuat objek itu tidak ada lagi.

Anda memiliki dua opsi:

1. Ubah DEFINER

Ini mungkin paling mudah dilakukan ketika pertama kali mengimpor objek basis data Anda, dengan menghapus DEFINERpernyataan apa pun dari dump.

Mengubah definisi kemudian sedikit lebih rumit:

Cara mengubah definisi untuk tampilan

  1. Jalankan SQL ini untuk menghasilkan pernyataan ALTER yang diperlukan

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
    
  2. Salin dan jalankan pernyataan ALTER

Bagaimana mengubah definisi untuk prosedur tersimpan

Contoh:

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

Hati-hati, karena ini akan mengubah semua definisi untuk semua database.

2. Buat pengguna yang hilang

Jika Anda menemukan kesalahan berikut saat menggunakan database MySQL:

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

Maka Anda dapat menyelesaikannya dengan menggunakan berikut:

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

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

Ini berfungsi seperti pesona - Anda hanya perlu mengubah someusernama pengguna yang hilang. Di server dev lokal, Anda biasanya hanya menggunakan root.

Juga pertimbangkan apakah Anda benar-benar perlu memberikan ALLizin kepada pengguna atau apakah mereka dapat melakukan lebih sedikit.

Chococroc
sumber
1
. dan opsi hibah tidak diperlukan.
helpse
@Simon East: Anda telah melakukan pengeditan yang indah, terima kasih banyak telah meningkatkan begitu banyak jawabannya
Chococroc
Saya sarankan menambahkan, mulai kembali contoh mySQL setelah menjalankan "UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'" permintaan karena definisi untuk prosedur hanya di-refresh kemudian.
johan
1
Saya pikir lebih mudah untuk menambahkan pengguna yang tidak berarti, karena saat Anda melakukan dbdump dan mengimpornya, Anda tidak perlu melakukan pengeditan tampilan / prosedur lagi
DarkMukke
1
Terima kasih, saya baru saja menjatuhkan meja dengan masalah, menghapus DEFINER=`user`@`host`dan mengimpornya kembali. Bekerja seperti pesona. : ok_hand:
giovannipds
139

Pengguna yang awalnya membuat tampilan atau prosedur SQL telah dihapus. Jika Anda membuat ulang pengguna itu, itu harus mengatasi kesalahan Anda.

Dave Z Dopson
sumber
3
Selain itu, Anda harus memberikan setidaknya SELECTdan EXECUTEhak istimewa kepada pengguna yang ditambahkan. Saya mengalami ini ketika saya mengekspor cadangan DB dari satu server ke yang lain di mana pengguna yang membuat rutinitas tidak ada di server pengujian.
drew010
5
Terima kasih, ini sangat membantu. Seringkali, ketika bermigrasi atau menggunakan mysqldump, pengguna yang membuat VIEW, TRIGGER, atau PROSEDUR (pembuat definisi) mungkin tidak sama pada sistem target. Dalam hal ini hanya menciptakan kembali prosedur, memicu atau melihat ( DROPlalu kembali CREATE) menggunakan pengguna yang valid pada sistem target harus melakukan trik.
Eric Kigathi
38
Anda juga dapat mengubah siapa pembuat definisi untuk pengguna yang ada:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
1
Tepat dalam kasus saya, saya memiliki tabel dengan pemicu yang menunjuk ke pengguna DEFINER yang telah dihapus. Memperbarui pemicu pengguna memecahkan masalah.
Miguel
Anda juga perlu memberikan izin kepada pengguna itu :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor
50

Saya mendapat kesalahan yang sama setelah memperbarui mysql.

Kesalahan telah diperbaiki setelah perintah ini:

mysql_upgrade -u root

mysql_upgrade harus dijalankan setiap kali Anda meningkatkan MySQL. Ia memeriksa semua tabel di semua database untuk ketidakcocokan dengan versi MySQL Server saat ini. Jika sebuah tabel ditemukan memiliki kemungkinan ketidakcocokan, itu dicentang. Jika ada masalah yang ditemukan, tabel diperbaiki. mysql_upgrade juga memutakhirkan tabel sistem sehingga Anda dapat memanfaatkan hak atau kemampuan baru yang mungkin telah ditambahkan.

artamonovdev
sumber
Tidak yakin mengapa ini tidak berhasil untuk saya, saya harus menghapus secara manual semua pemicu di mySQL workbench.
user752746
35

Jika pengguna ada, maka:

mysql> flush privileges;
BroknDodge
sumber
34

Buat pengguna yang dihapus seperti ini:

mysql> create user 'web2vi';

atau

mysql> create user 'web2vi'@'%';
Kevin
sumber
3
setelah membuat pengguna yang terlewat itu, mengalami kesalahan lain: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'dan harus menambahkan perintah ini grant all on *.* to 'web2vi'@'%' identified by ''setelah membuat pengguna
zhuguowei
31

Ikuti langkah ini:

  1. Pergi ke PHPMyAdmin
  2. Pilih Database Anda
  3. Pilih meja Anda
  4. Di menu paling atas Klik 'Pemicu'
  5. Klik 'Edit' untuk mengedit pemicu
  6. Ubah definisi dari [user @ localhost] menjadi root @ localhost

Semoga ini bisa membantu

hussainfrotan
sumber
1
Ini adalah solusi aktual untuk pertanyaan, daripada membuat izin pengguna dan memberikan. ubah saja definer.
Ankit Chauhan
Apakah ada cara untuk menemukan semua pemicu dalam basis data?
Mrugesh Mistry
1
Temukan semua pemicu: TAMPILKAN PEMICU
JerzySkalski
Dari baris perintah 'show triggerss', dari PhpMyAdmin pilih database dan kemudian di kanan atas klik navbar pada trigger
hussainfrotan
21

Solusi hanyalah satu baris permintaan seperti di bawah ini:

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

Ganti ROOTdengan nama pengguna mysql Anda. Ganti PASSWORDdengan kata sandi mysql Anda.

Muhammad Azeem
sumber
1
Hati-hati: Pengguna MySQL peka huruf besar-kecil.
Alessio Cantarella
Saya perlu flush privilegessetelah ini dan itu berhasil. Terima kasih.
Victor
14

Diperbaiki dengan menjalankan komentar berikut ini.

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

jika Anda mendapatkan some_otheralih-alih web2vimaka Anda harus mengubah nama yang sesuai.

Selvamani
sumber
13

Untuk googler masa depan: Saya mendapat pesan serupa yang mencoba memperbarui tabel dalam database yang tidak mengandung tampilan. Setelah beberapa penggalian, ternyata saya telah mengimpor pemicu pada tabel itu, dan itu adalah hal-hal yang didefinisikan oleh pengguna yang tidak ada. Menjatuhkan pemicu menyelesaikan masalah.

Chris Poirier
sumber
Pemicu adalah masalahnya, saya memperbarui definisi di bagian pemicu. tidak ada masalah lagi.
Darius
Terima kasih, ini sangat membantu. Juga perlu memperbarui tampilan.
toxxxa
Memang sangat membantu :) Saya tidak akan pernah menemukan itu sendirian.
ElChupacabra
7

perbaikan cepat untuk mengatasi dan membuang file:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
Pengembang
sumber
1
ini tidak bekerja. definer terkandung dalam dump.
phil294
Jika Anda menggunakan mysqlpump dengan "p" dan bukan "d", Anda dapat menggunakan --skip-definer
Wouter
@lyhong Saya tidak punya penjelasan mendetail, tetapi tampaknya --single-transactionmengubah cara Lock Tables diimplementasikan saat dump. Atau semacam itu. Saya tidak ingat di mana saya membacanya, tetapi itu membantu saya merasa nyaman dengan "hanya melempar bendera". Saya juga merasa tidak nyaman dengan jawaban "just do this" yang tidak dijelaskan. Either way, itu berhasil untuk kasus saya.
SherylHohman
7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

contoh:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
mesutpiskin
sumber
Jika saya memberikan semua hak istimewa kepada 'pengguna' @ 'semua ips', lalu bagaimana dengan keamanan ?? !!
Mohsen Abasi
@MohsenAbasi Ini adalah contoh untuk lingkungan pengembangan. Pengguna ini dapat menjadi administrator sistem. Lingkungan prod harus lebih berhati-hati.
mesutpiskin
7

Ini terjadi pada saya setelah memindahkan DB dari satu server ke server lain. Awalnya, definer menggunakan localhost dan pengguna. Di server baru kami tidak memiliki pengguna itu, dan host juga telah diubah. Saya mengambil kembali tabel itu dan menghapus semua pemicu secara manual dari phpmyadmin . Setelah itu bekerja dengan baik untuk saya.

TS Guhan
sumber
Terima kasih atas tipnya, saya bisa menghapus secara manual semua pemicu di mySQL workbench.
user752746
Ini memang masalah pemicu bagi saya, saya harus menghapus dan membuat ulang semuanya
paul.ago
apakah ada solusi lain selain menciptakan pemicu? Saya menggunakan test dump kadang-kadang dua kali sehari. ini akan mengganggu proses utama saya
redestructa
@TS Guhan apakah Anda menambahkan kembali pemicu setelah Anda menghapusnya secara manual?
MailBlade
6

Saya memiliki masalah yang sama dengan pengguna root dan ini berhasil ketika saya diganti

root@%

oleh

root@localhost

Jadi, jika pengguna 'web2vi' diizinkan untuk terhubung dari 'localhost', Anda dapat mencoba:

web2vi@localhost

Saya terhubung dari jauh ke database.

c-toesca
sumber
4

5 sen saya.

Saya memiliki kesalahan yang sama ketika saya mencoba untuk memilih dari tampilan.

Namun masalah tampaknya adalah tampilan ini, dipilih dari tampilan lain yang dipulihkan dari cadangan dari server yang berbeda.

dan pada kenyataannya, YA, pengguna tidak valid, tetapi tidak jelas ke mana harus dari tampilan pertama.

Nick
sumber
4

Saya mengalami masalah Anda yang sama beberapa menit yang lalu, saya mengalami masalah ini setelah menghapus pengguna yang tidak digunakan dari tabel mysql.user, tetapi melakukan perubahan tampilan memperbaikinya, berikut adalah perintah praktis yang membuatnya sangat sederhana:

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

Campurkan ini dengan baris perintah mysql (dengan asumsi * nix, tidak terbiasa dengan windows):

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

Catatan: perintah menghasilkan dan CONCAT PILIH tambahan pada file, membuat mysql -uuser -ppass databasename < alterView.sqlgagal jika Anda tidak menghapusnya.

Sumber: /dba/4129/modify-definer-on-many-views

Ziul
sumber
4

Cobalah untuk mengatur prosedur Anda sebagai SECURITY INVOKER

Standar Mysql menetapkan prosedur keamanan sebagai "DEFINER" (PENCIPTA) .. Anda harus mengatur keamanan ke "penyerang".

Allan Felipe Murara
sumber
3

Tampilan Anda, "view_quotes" mungkin telah disalin dari database yang berbeda di mana "web2vi" adalah pengguna yang valid ke dalam database di mana "web2vi" bukan pengguna yang valid.
Baik menambahkan pengguna "web2vi" ke database atau mengubah tampilan (biasanya menghapus DEFINER = 'web2vi' @ '%' dan menjalankan skrip akan melakukan trik)

pengguna1016736
sumber
3

Dalam kasus saya, tabel memiliki pemicu dengan pengguna DEFINER yang tidak ada.

jbaylina
sumber
2
tepat di kuku khususnya ketika aplikasi ditransfer dari server ke yang lain
zardilior
2

Dari referensi MySQL tentang CREATE VIEW:

Klausa DEFINER dan SQL SECURITY menentukan konteks keamanan yang akan digunakan ketika memeriksa hak akses pada waktu permintaan pemanggilan.

Pengguna ini harus ada dan selalu lebih baik menggunakan 'localhost' sebagai nama host. Jadi saya pikir jika Anda memeriksa apakah ada pengguna dan mengubahnya ke 'localhost' di buat tampilan Anda tidak akan memiliki kesalahan ini.

jordeu
sumber
2

Masalahnya jelas - MySQL tidak dapat menemukan pengguna yang ditentukan sebagai definisi.

Saya mengalami masalah ini setelah menyinkronkan model database dari server pengembangan, menerapkannya ke localhost, membuat perubahan pada model dan kemudian menerapkannya kembali ke localhost. Rupanya ada tampilan (saya modifikasi) yang ditentukan dan jadi saya tidak bisa memperbarui versi lokal saya.

Cara memperbaiki (dengan mudah) :

Catatan: ini melibatkan penghapusan sehingga berfungsi dengan baik untuk tampilan tetapi pastikan Anda memiliki cadangan data jika Anda mencoba ini pada tabel.

  1. Login ke database sebagai root (atau apa pun yang memiliki kekuatan yang cukup untuk melakukan perubahan).
  2. Hapus tampilan, tabel, atau apa pun yang bermasalah dengan Anda.
  3. Sinkronkan model baru Anda - tidak akan mengeluh tentang sesuatu yang tidak ada sekarang. Anda mungkin ingin menghapus bagian SQL SECURITY DEFINER dari definisi item yang bermasalah.

PS Ini bukan perbaikan yang tepat atau yang terbaik. Saya hanya mempostingnya sebagai solusi yang mungkin (dan sangat sederhana).

Pijusn
sumber
saya menggunakan kodok, cn saya menghapus dan membuat ulang hanya menggunakan os yang harus saya login sebagai rooy dari terminal dan kemudian hanya melakukan ??
Vasanth Nag KV
2

Anda dapat mencoba ini:

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;
Sukamdani Barli
sumber
2

Mengapa saya mendapatkan kesalahan itu? Bagaimana saya memperbaikinya?

Saya menghabiskan satu jam sebelum menemukan keputusan untuk masalah seperti ini. Tetapi, dalam kasus saya, saya menjalankan ini:

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

Jika Anda benar-benar ingin menemukan masalah, jalankan perintah ini satu per satu:

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

... dan, setelah masing-masing, cari bidang 'definisi'.

Dalam kasus saya itu adalah pemicu tua berjanggut, bahwa seseorang pengembang lupa untuk menghapus.

kivagant
sumber
1

Buka bagian edit rutin dan dan di bagian bawah, ubah Jenis Keamanan dari Definer menjadi Invoker.

pengguna1174436
sumber
4
Pergi kemana? Di perangkat lunak mana?
kenorb
@kenorb, di phpMyAdmin Anda dapat mengubah rutinitas tersimpan MySQL (prosedur dan fungsi), misalnya Jenis Keamanan.
Mikl
1

Satu atau beberapa tampilan Anda di mana dibuat / didaftarkan oleh pengguna lain. Anda harus memeriksa pemilik tampilan dan:

  1. Buat kembali pengguna; seperti jawaban yang lain katakan. atau
  2. Buat kembali tampilan yang dibuat oleh pengguna 'web2vi'menggunakan ALTER VIEW

Saya pernah mengalami masalah ini.

Saya mencoba memigrasi tampilan, dari BD1 ke BD2, menggunakan SQLYog. SQLYog menciptakan kembali pandangan di DataBase lain (DB2), tetapi itu membuat pengguna BD1 (mereka di mana berbeda). Kemudian saya menyadari bahwa pandangan yang saya gunakan dalam permintaan saya memiliki kesalahan yang sama dengan Anda, bahkan ketika saya tidak membuat tampilan apa pun.

Semoga bantuan ini.

Julio Indriago
sumber
1

Jika ini adalah prosedur tersimpan, Anda dapat melakukan:

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

Tapi ini tidak disarankan.

Bagi saya, solusi yang lebih baik adalah membuat definisi:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
bantu
sumber
Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'grant all on' mytable '. * ke' myuser 'yang diidentifikasi oleh' mypass ';' pada baris 1
Cerin
@Cerin, Cukup ubah '' di sekitar mytable ke ``. Jawaban saya bertujuan untuk membantu orang dengan masalah ini .. Pikirkan untuk mempertimbangkan kembali downvote Anda ..
helpse
1

ketika mysql.proc kosong, tetapi sistem selalu memperhatikan "[email protected].%" karena table_name tidak ada, Anda cukup root di baris perintah mysql dan ketik:

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

lebih!

zhi.yang
sumber
1

Ini terjadi pada saya setelah saya mengimpor dump pada Windows 10 dengan MYSQL Workbench 6.3 Community, dengan "root @% tidak ada". Meskipun pengguna ada. Pertama saya mencoba mengomentari DEFINER namun, ini tidak berhasil. Saya kemudian melakukan penggantian string pada "root @%" dengan "root @ localhost" dan mengimpor kembali dump. Ini berhasil bagi saya.

Dévan Coetzee
sumber
0

Pengguna basis data juga tampaknya peka terhadap huruf besar-kecil, jadi sementara saya memiliki root '@'% pengguna, saya tidak memiliki ROOT '@'% pengguna. Saya mengubah pengguna menjadi huruf besar melalui meja kerja dan masalahnya teratasi!

Metalmania
sumber