MySQL hatası 1449: Bir tanımlayıcı olarak belirtilen kullanıcı mevcut değil


354

Aşağıdaki sorguyu çalıştırdığımda bir hata alıyorum:

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

Hata mesajı:

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

Neden bu hatayı alıyorum? Nasıl düzeltebilirim?


7
Bize 'GÖSTERİNİZİ GÖSTERİN' view_quotes '
jordeu

Hata, view_quotesgörüş koşullarında olmalıdır .
Shell

Bunu düşündükten sonra bir an ve en basit eylem, eksik hesabı veritabanına eklemekti ve hata ortadan kalktı. Karmaşık bir prosedür gerekmez. Hesabı ekleyebiliyorsanız önce deneyin.
user1794918

Yanıtlar:


540

Bu genellikle görünümleri / tetikleyicileri / yordamları bir veritabanından veya sunucudan diğerine aktarırken, bu nesneyi oluşturan kullanıcı artık mevcut olmadığında oluşur.

İki seçeneğiniz var:

1. DEFINER'ı değiştirin

Bu, veritabanı nesnelerinizi ilk kez içe aktarırken DEFINERdökümünden herhangi bir ifade kaldırarak yapılması en kolay yoldur .

Tanımlayıcıyı daha sonra değiştirmek biraz daha zordur:

Görünümler için tanımlayıcı nasıl değiştirilir

  1. Gerekli ALTER deyimlerini oluşturmak için bu SQL'i çalıştırın

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. ALTER deyimlerini kopyalayıp çalıştırın

Saklı yordamlar için tanımlayıcı nasıl değiştirilir

Misal:

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

Dikkatli olun, çünkü bu tüm veritabanları için tüm tanımları değiştirecektir.

2. Eksik kullanıcıyı oluşturun

MySQL veritabanını kullanırken aşağıdaki hatayı bulduysanız:

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

Sonra aşağıdakileri kullanarak çözebilirsiniz:

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

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

Bu bir cazibe gibi çalıştı - sadece someusereksik kullanıcının adını değiştirmeniz gerekir. Yerel bir dev sunucusunda genellikle kullanabilirsiniz root.

Ayrıca, kullanıcı ALLizinlerini gerçekten vermeniz gerekip gerekmediğini veya daha azıyla izin verip veremeyeceğini de düşünün .


1
. ve hibe seçeneği gerekli değildir.
14'te

@Simon East: Güzel bir düzenleme yaptınız, cevabı çok geliştirdiğiniz için çok teşekkür ederim.
Chococroc

Ben, "UPDATE mysql. procP SET definer = 'kullanıcı @%' WHERE definer = 'root @%'" sorgusu çalıştırdıktan sonra mySQL örneğini eklemeyi öneririm, çünkü yordamların tanımları yalnızca o zaman yenilenir.
johan

1
Anlamsız bir kullanıcı eklemek daha kolay olduğunu düşünüyorum, çünkü bir dahaki sefere bir dbdump ve içe aktardığınızda, görünümleri / prosedürleri tekrar düzenleme
yapmanız gerekmeyecek

1
Teşekkürler, sorunla masayı düşürdüm, kaldırdım DEFINER=`user`@`host`ve yeniden aldım . Bir cazibe gibi çalıştı. : ok_hand:
giovannipds

139

Başlangıçta SQL görünümünü veya prosedürünü oluşturan kullanıcı silindi. Bu kullanıcıyı yeniden oluşturursanız, hatanızı ele almalıdır.


3
Ayrıca , eklenen kullanıcıya en azından SELECTve EXECUTEayrıcalıkları vermeniz gerekecektir . Ben bir sunucudan diğerine bir DB yedekleme ihraç zaman ben rutinleri yaratan kullanıcı test sunucusunda yoktu bu koştu.
drew010

5
Teşekkürler, bu yardımcı oldu. Genellikle, mysqldump kullanarak taşıma veya dağıtım yaparken VIEW, TRIGGER veya PROCEDURE (tanımlayıcı) öğesini oluşturan kullanıcı hedef sistemde aynı olmayabilir. Bu durumda, sadece prosedürü DROPyeniden oluşturmak , tetiklemek veya CREATEhedef sistemde geçerli bir kullanıcı kullanarak görüntülemek ( sonra yeniden ) hile yapmalıdır.
Eric Kigathi

38
tanımlayıcının kim olduğunu mevcut bir kullanıcıya da değiştirebilirsiniz:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';

1
Tam olarak benim durumumda silinen bir DEFINER kullanıcısına işaret eden tetikleyici içeren bir tablo vardı. Tetikleyici kullanıcının güncellenmesi sorunu çözdü.
Miguel

Ayrıca bu kullanıcıya izin vermeniz gerekir :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor

50

MySQL güncelledikten sonra aynı hatayı aldım.

Bu komuttan sonra hata düzeltildi:

mysql_upgrade -u root

MySQL'i her yükselttiğinizde mysql_upgrade yürütülmelidir. Tüm veritabanlarındaki tüm tabloları, geçerli MySQL Server sürümüyle uyumsuzluk açısından kontrol eder. Bir tablonun olası bir uyumsuzluğu olduğu tespit edilirse, kontrol edilir. Herhangi bir sorun bulunursa, tablo onarılır. mysql_upgrade ayrıca, eklenmiş olabilecek yeni ayrıcalıklardan veya özelliklerden yararlanabilmeniz için sistem tablolarını yükseltir.


Bunun neden işe yaramadığından emin değilim, mySQL çalışma tezgahındaki tüm tetikleyicileri manuel olarak kaldırmak zorunda kaldım.
user752746


34

Silinen kullanıcıyı şu şekilde oluşturun:

mysql> create user 'web2vi';

veya

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

3
kaçırılan kullanıcıyı oluşturduktan sonra başka bir hatayla karşılaştı: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo've grant all on *.* to 'web2vi'@'%' identified by ''kullanıcı oluşturduktan sonra bu komutu eklemelisiniz
zhuguowei

31

Bu adımları takip et:

  1. PHPMyAdmin'e gidin
  2. Veritabanınızı Seçin
  3. Masanızı seçin
  4. Üst menüde 'Tetikleyiciler'i tıklayın
  5. Tetikleyiciyi düzenlemek için 'Düzenle'yi tıklayın
  6. Tanımlayıcıyı [user @ localhost] yerine root @ localhost olarak değiştirin

Umarım yardımcı olur


1
Bu, kullanıcı oluşturmak ve izin vermek yerine sorunun gerçek çözümüdür. sadece tanımlayıcıyı değiştirin.
Ankit Chauhan

Veritabanındaki tüm tetikleyicileri bulmanın herhangi bir yolu var mı?
Mrugesh Mistry

1
Tüm tetikleyicileri bul: SHOW
TRIGGERS

Komut satırından 'show triggerss', PhpMyAdmin'den veritabanını seçin ve navbar'ın sağ üst kısmında tetikleyicilere tıklayın
navbar'ın

21

Çözüm, aşağıdaki gibi yalnızca tek satırlık bir sorgudur:

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

ROOTMySQL kullanıcı adınızla değiştirin . PASSWORDMySQL şifrenizle değiştirin .


1
Dikkatli olun: MySQL kullanıcıları büyük / küçük harfe duyarlıdır.
Alessio Cantarella

Bundan flush privilegessonra ihtiyacım vardı ve işe yarıyor. Teşekkürler.
Victor

14

Aşağıdaki yorumlar çalıştırılarak düzeltildi.

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

some_otherbunun yerine alıyorsanız web2vi, adı buna göre değiştirmeniz gerekir.


13

Gelecekteki googlers için: Veritabanında hiçbir tablo içermeyen bir tabloyu güncellemeye çalışan benzer bir mesaj aldım. Bazı kazmalardan sonra, o tabloda tetikleyicileri içe aktardım ve bunlar var olmayan kullanıcı tarafından tanımlanan şeylerdi. Tetikleyicileri düşürmek sorunu çözdü.


Tetikleyiciler sorundu, tetikleyiciler bölümünde tanımlayıcıyı güncelledim. daha fazla sorun yok.
Darius

Teşekkürler, çok faydalı. Ayrıca görünümleri güncellemeniz gerekiyor.
toxxxa

Gerçekten çok yararlı :) Bunu asla yalnız bulamazdım.
ElChupacabra


7

hızlı çözüm geçici çözüm ve dosyayı dökümü:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql

1
bu çalışmıyor. tanımlayıcı çöplükte bulunur.
phil294

Mysqlpump "d" yerine "p" ile birlikte kullanılırsa, --skip-definer
Wouter

@lyhong Ayrıntılı bir açıklamam yok, ama görünüşe göre --single-transactionLock Tables dökümü sırasında uygulanma şeklini değiştirir. Ya da böyle bir şey. Nerede okuduğumu hatırlamıyorum, ama bu "sadece bayrağı atmakla" rahat etmemi sağladı. Ayrıca açıklanamayan 'sadece bunu yap' 'cevaplarından da rahatsızım. Her iki durumda da benim durumum için çalıştı.
SherylHohman

7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

misal:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;

Eğer bir 'kullanıcı' @ 'tüm ips' için tüm ayrıcalıkları verirseniz, ya güvenlik hakkında ??
Mohsen Abasi

@MohsenAbasi Bu, geliştirme ortamına bir örnektir. Bu kullanıcı sistem yöneticisi olabilir. Ürün ortamının daha dikkatli olması gerekir.
mesutpiskin

7

Bu, DB'yi bir sunucudan başka bir sunucuya taşıdıktan sonra başıma geldi. Başlangıçta, tanımlayıcı localhost ve kullanıcı kullanıyordu. Yeni sunucuda bu kullanıcı yok ve ana bilgisayar da değiştirilmişti. Bu tabloyu yedekledim ve tüm tetikleyicileri elle phpmyadmin'den kaldırdım . Bundan sonra benim için iyi çalışıyor.


Bahşiş için teşekkürler, mySQL çalışma tezgahındaki tüm tetikleyicileri manuel olarak kaldırabildim.
user752746

Bu gerçekten benim için tetikleyici bir sorundu, hepsini kaldırmak ve yeniden oluşturmak zorunda kaldım
paul.ago

tetikleyicileri yeniden oluşturmaktan başka bir çözüm var mı? Test dökümlerini bazen günde iki kez kullanıyorum. bu benim ana süreçlerimi
bozar

@TS Guhan, tetikleyicileri manuel olarak kaldırdıktan sonra yeniden eklediniz mi?
MailBlade

6

Kök kullanıcı ans ile aynı sorunu yaşadım, değiştirdiğimde benim için çalıştı

root@%

tarafından

root@localhost

Dolayısıyla, 'web2vi' kullanıcısının 'localhost' sitesinden bağlanmasına izin verilirse deneyebilirsiniz:

web2vi@localhost

Veritabanına uzaktan bağlıyım.


4

Benim 5 sentim.

Bir görünümden seçim yapmaya çalışırken aynı hatayla karşılaştım.

Ancak sorun, bu görünümün, farklı sunucudan yedeklemeden geri yüklenen başka bir görünümden seçilmesidir.

ve aslında, EVET, kullanıcı geçersizdi, ancak ilk bakıştan nereye gidileceği belli değildi.


4

Dakikalar önce aynı sorun vardı, mysql.user tablosundan kullanılmayan bir kullanıcı sildikten sonra bu sorunla karşılaştım, ancak alter görünüm düzeltildi, burada çok basit kılan kullanışlı bir komut:

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

Bunu mysql komut satırı ile karıştırın (* nix varsayalım, pencerelere aşina değil):

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

Not: Komut dosyada ekstra CONECT CONATAT oluşturur ve mysql -uuser -ppass databasename < alterView.sqlkaldırmazsanız başarısız olur.

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


4

Prosedürünüzü şu şekilde ayarlamaya çalışın: SECURITY INVOKER

Mysql varsayılan prosedür güvenliğini "DEFINER" (CREATOR OF) olarak ayarlar .. güvenliği "invoker" olarak ayarlamanız gerekir.


3

"View_quotes" görünümünüz, "web2vi" nin geçerli bir kullanıcı olduğu farklı bir veritabanından "web2vi" nin geçerli bir kullanıcı olmadığı bir veritabanına kopyalanmış olabilir.
Ya "web2vi" kullanıcısını veritabanına ekleyin veya görünümü değiştirin (normalde DEFINER = 'web2vi' @ '%' bölümünü kaldırmak ve komut dosyasını çalıştırmak hile yapacaktır)


3

Benim durumumda, tablo var olmayan bir DEFINER kullanıcısı ile bir tetikleyici vardı.


2
uygulama bir sunucudan diğerine aktarıldığında özel olarak çivi üzerinde
zardilior

2

Gönderen MySQL referans ait CREATE VIEW:

DEFINER ve SQL SECURITY yan tümceleri, görünüm çağırma zamanında erişim ayrıcalıkları kontrol edilirken kullanılacak güvenlik bağlamını belirtir.

Bu kullanıcı mevcut olmalı ve ana makine adı olarak 'localhost'u kullanmak her zaman daha iyidir. Bu nedenle, kullanıcının var olup olmadığını kontrol edip oluşturma görünümünde 'localhost' olarak değiştirirseniz bu hatayı almayacağınızı düşünüyorum.


2

Sorun açık - MySQL, tanımlayıcı olarak belirtilen kullanıcıyı bulamıyor.

Veritabanı sunucusunu geliştirme sunucusundan senkronize ettikten, localhost'a uyguladıktan, modelde değişiklik yaptıktan ve localhost'a yeniden uyguladıktan sonra bu sorunla karşılaştım. Görünüşe göre bir görünüm (değiştirdim) tanımlanmış ve bu nedenle yerel sürümümü güncelleyemedim.

Nasıl düzeltilir (kolayca) :

Not: silmeyi içerir, böylece görünümler için iyi çalışır, ancak tablolarda denediğinizde verilerin yedeklendiğinden emin olun.

  1. Veritabanına root (veya değişiklik yapmak için yeterli güce sahip olan) olarak giriş yapın.
  2. Görünümü, tabloyu veya sorun yaşadığınız her şeyi silin.
  3. Yeni modelinizi senkronize edin - şu anda var olmayan bir şeyden şikayet etmeyecektir. SQL SECURITY DEFINER parçasını, sorun yaşadığınız öğe tanımından kaldırmak isteyebilirsiniz .

Not: Bu ne uygun ne de en iyi çözümdür. Sadece olası (ve çok basit) bir çözüm olarak yayınladım.


kurbağa kullanıyorum, cn i silmek ve sadece os i terminalden rooy olarak giriş yapmalı ve sonra sadece yapmak kullanarak yeniden?
Vasanth Nag KV

2

Bunu deneyebilirsiniz:

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

2

Neden bu hatayı alıyorum? Nasıl düzeltebilirim?

Bir saat önce böyle bir problem için bir karar buldum. Ama, benim durumumda, bunu çalıştırdım:

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

Sorunu gerçekten bulmak istiyorsanız, bu komutları tek tek çalıştırın:

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

... ve her birinin ardından 'tanımlayıcı' alanını arayın.

Benim durumumda, geliştiricilerin birisinin silmeyi unuttuğu eski tetikleyici saklanmıştı.


1

Düzenleme rutin bölümüne gidin ve en altta Güvenlik Türü'nü Tanımlayıcı'dan Invoker olarak değiştirin.


4
Nereye gidiyorsun? Hangi yazılımda?
kenorb

@kenorb, phpMyAdmin'de MySQL depolanmış rutinlerini (prosedürler ve fonksiyonlar) değiştirebilirsiniz, örneğin Güvenlik Türü.
Mikl

1

Başka bir kullanıcı tarafından oluşturulduğu / kaydedildiği görünümlerin biri veya birkaçı. Görünümün sahibini kontrol etmeniz ve:

  1. Kullanıcıyı yeniden oluşturun; diğer cevapların söylediği gibi. veya
  2. ALTER VIEW'web2vi' kullanarak kullanıcı tarafından oluşturulan görünümleri yeniden oluşturun

Bu sorunu bir kez yaşadım.

SQLYog kullanarak BD1'den BD2'ye görünümleri taşımaya çalışıyordum. SQLYog, diğer DataBase'deki (DB2) görünümleri yeniden oluşturdu, ancak BD1 kullanıcısını (farklı yerlerde) tuttu. Daha sonra, sorgumda kullandığım görünümlerin, herhangi bir görünüm oluşturmasam bile sizinle aynı hatayı yaşadığını fark ettim.

Umarım bu yardım.


1

Bu saklı bir yordamsa şunları yapabilirsiniz:

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

Ancak bu tavsiye edilmez.

Benim için daha iyi bir çözüm tanımlayıcı oluşturmaktır:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';

SQL sözdiziminizde bir hata var; 'mytable' için 'tümünü ver' seçeneğinin yanında 'mypass' ile tanımlanan 'myuser' için doğru sözdiziminin MySQL sunucu sürümünüze karşılık gelen kılavuza bakın; 1
Cerin

@Cerin, Sadece mytable'ın etrafında `` olarak değiştir. Cevabım bu sorunla insanlara yardım etmeyi amaçlıyor .. Downvote'unuzu yeniden düşünmeyi düşünün ..
helpse

1

mysql.proc boş olduğunda, ancak sistem her zaman table_name no için "user@192.168.%" farkına varırsa, sadece mysql komut satırına root yazarsınız ve şunu yazarsınız:

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

bitmiş!


1

MYSQL Workbench 6.3 Community ile Windows 10 üzerinde "root @% mevcut değil" ile bir döküm ithal ettikten sonra bu bana oldu. Kullanıcı var olmasına rağmen. Öncelikle DEFINER'ı yorumlamaya çalıştım ancak bu işe yaramadı. Sonra "root @%" yerine "root @ localhost" ile bir dize yerine yaptım ve döküm yeniden. Bu benim için hile yaptı.



0

Veritabanı kullanıcısı da büyük / küçük harfe duyarlı gibi görünüyor, bu yüzden '%' root kullanıcısı varken ROOT '@'% kullanıcısı yoktu. Kullanıcıyı tezgah aracılığıyla büyük harf olarak değiştirdim ve sorun çözüldü!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.