web-dev-qa-db-ja.com

MySQLエラー1449:定義者として指定されたユーザが存在しません

次のクエリを実行するとエラーが発生します。

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

エラーメッセージは次のとおりです。

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

なぜ私はそのエラーが出ますか?どうやって直すの?

283
Tech MLG

これは通常、そのオブジェクトを作成したユーザーが存在しなくなったときに、あるデータベースまたはサーバーから別のデータベースまたはサーバーにビュー/トリガー/プロシージャーをエクスポートするときに発生します。

2つの選択肢があります。

1.定義者を変更する

これは、ダンプからDEFINERステートメントを削除することによって、データベースオブジェクトを最初にインポートするときに最も簡単に行うことができます。

定義者を後で変更するのは、もう少し注意が必要です。

ビューの定義者を変更する方法

  1. このSQLを実行して必要なALTERステートメントを生成します。

    SELECT CONCAT("ALTER DEFINER=`youruser`@`Host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
    
  2. ALTERステートメントをコピーして実行する

ストアドプロシージャの定義者を変更する方法

例:

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

これはすべてのデータベースのすべての定義者を変更するので注意してください。

2.足りないユーザーを作成します

MySQLデータベースの使用中に以下のエラーが発生した場合

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

その後、以下を使用してそれを解決することができます。

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

これは魅力のように働きました - someuserを行方不明のユーザーの名前に変更するだけです。ローカルの開発サーバーでは、通常は単にrootを使用します。

また、実際にユーザーにALLアクセス許可を付与する必要があるのか​​、それともそれ以下でアクセスできるのかを検討してください。

427
Chococroc

SQLビューまたはプロシージャを最初に作成したユーザーは削除されました。そのユーザーを再作成した場合は、エラーに対処する必要があります。

130
Dave Z Dopson

私はmysqlを更新した後に同じエラーを得ました。

このコマンドの後にエラーが修正されました。

mysql_upgrade -u root

mySQLをアップグレードするたびにmysql_upgradeを実行する必要があります。現在のバージョンのMySQL Serverとの非互換性について、すべてのデータベースのすべてのテーブルをチェックします。テーブルに非互換性がある可能性があることが判明した場合は、チェックされます。問題が見つかった場合、テーブルは修復されます。 mysql_upgradeはシステムテーブルもアップグレードするので、追加された可能性がある新しい権限または機能を利用できます。

47
artamonovdev

ユーザーが存在する場合、

mysql> flush privileges;
34
BroknDodge

このようにして削除されたユーザーを作成します。

mysql> create user 'web2vi';

または

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

次の手順を実行します:

  1. PHPMyAdminに行く
  2. データベースを選択してください
  3. テーブルを選択してください
  4. トップメニューで「トリガー」をクリック
  5. トリガーを編集するには「編集」をクリックします
  6. 定義者を[user @ localhost]からroot @ localhostに変更します。

それが役に立てば幸い

19
hussainfrotan

解決策は、以下のように単一行のクエリです。

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

ROOTをあなたのmysqlユーザー名に置き換えてください。PASSWORDをあなたのmysqlパスワードに置き換えてください。

17
Muhammad Azeem

将来のgooglersのために:私はビューを含んでいないデータベースのテーブルを更新しようとしている同様のメッセージを得ました。少し掘り下げた後、私はそのテーブルのトリガーをインポートしたことが判明しました、そしてそれらは存在しないユーザーによって定義されたものでした。トリガーを落とすことで問題は解決しました。

13
Chris Poirier

以下のコメントを実行して修正してください。

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

some_otherの代わりにweb2viを取得している場合は、それに応じて名前を変更する必要があります。

11
Selvamani

ユーザ 'web2vi'はあなたのmysqlサーバに存在しません。

http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user を参照してください。

そのユーザーが存在する場合は、どのサーバーからアクセスできるかを確認します。これは別のエラーになると思いますが(例:web2vi @ localhostを使用しているが、web2vi @%としてdbにアクセスしている場合)

7
cosmorogers

ファイルを回避してダンプするための簡単な修正:

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

私は交換したとき私はそれが私のために働いたANSと同じ問題を抱えていた

root@%

によって

root@localhost

そのため、ユーザー「web2vi」が「localhost」からの接続を許可されている場合は、次のことを試すことができます。

web2vi@localhost

データベースにリモート接続しています。

5
c-toesca

これは私がDBをあるサーバーから別のサーバーに移動した後に起こりました。当初、定義者はlocalhostとユーザーを使用していました。新しいサーバーでは、そのユーザーとホストも変更されていません。私はその特定のテーブルのバックアップを取り、 phpmyadminからすべてのトリガーを手動で削除します 。その後、その作業は私にとっては問題ありません。

4
TS Guhan

プロシージャをSECURITY INVOKERとして設定してみてください

Mysqlのデフォルトはプロシージャのセキュリティを "DEFINER"(CREATOR OF)に設定します。セキュリティを "invoker"に設定する必要があります。

4

私の5セント.

ビューから選択しようとしたときに同じエラーが発生しました。

しかし、問題は、このビューが、別のサーバーからのバックアップから復元された別のビューから選択されていることです。

そして実際には、はい、ユーザーは無効でしたが、最初の一見からどこへ行くべきか明らかではありませんでした。

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

例:

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

私の場合、テーブルには存在しないDEFINERユーザーとのトリガーがありました。

3
jbaylina

私は数分前にあなたと全く同じ問題を抱えていました、私はmysql.userテーブルから未使用のユーザーを削除した後にこの問題に遭遇しました。

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

これをmysqlコマンドラインと混ぜ合わせてください(* nixを仮定し、windowsには馴染みがない)。

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

注:このコマンドはファイルに追加のSELECT CONCATを生成し、削除しないとmysql -uuser -ppass databasename < alterView.sqlを失敗させます。

ソース: https://dba.stackexchange.com/questions/4129/modify-definer-on-many-views

2
Ziul

あなたのビュー "view_quotes"は、 "web2vi"が有効なユーザーである別のデータベースから "web2vi"が有効なユーザーではないデータベースにコピーされた可能性があります。
データベースに "web2vi"ユーザーを追加するか、ビューを変更します(通常はDEFINER = 'web2vi' @ '%'部分を削除してスクリプトを実行するとうまくいきます)。

2
user1016736

これを試すことができます:

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

これがストアドプロシージャの場合は、次の操作を実行できます。

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

しかし、これはお勧めできません。

私にとっては、より良い解決策は定義者を作成することです。

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

なぜ私はそのエラーが出ますか?どうやって直すの?

私はこのような問題に対する決定を見つける前に1時間を費やしました。しかし、私の場合、私はこれを実行しました:

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

本当に問題を見つけたいのであれば、次のコマンドを1つずつ実行してください。

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

...そして、それぞれの後に、フィールド 'definer'を探します。

私の場合は、開発者の誰かが削除するのを忘れていたことが古い引き金になっていました。

1
kivagant

MySQLリファレンスCREATE VIEW

DEFINER句とSQL SECURITY句は、ビューの呼び出し時にアクセス権限をチェックするときに使用されるセキュリティコンテキストを指定します。

このユーザーは存在していなければならず、常に「localhost」をホスト名として使用することをお勧めします。そのため、ユーザーが存在することを確認し、作成ビューで「localhost」に変更しても、このエラーは発生しません。

1
jordeu

編集ルーチンセクションに行き、一番下で、セキュリティタイプを定義者から実行者に変更します。

1
user1174436

他のユーザーによって作成または登録された1つまたは複数のビュー。あなたはビューの所有者をチェックしなければならないでしょう、そして:

  1. ユーザーを再作成してください。他の答えが言うように。または
  2. ALTER VIEW を使用して、ユーザー'web2vi'によって作成されたビューを再作成します。

私は一度この問題を抱えていました。

SQLYogを使用して、ビューをBD1からBD2に移行しようとしていました。 SQLYogはビューを他のデータベース(DB2)に再作成しましたが、それはBD1のユーザーを保持しました(それらが異なる場合)。後になって、クエリで使用していたビューは、ビューを作成していなくても、あなたと同じエラーが発生していることに気付きました。

この助けを願っています。

1
Julio Indriago

問題は明らかです - MySQLは定義者として指定されたユーザーを見つけることができません。

開発サーバーからデータベースモデルを同期化し、それをlocalhostに適用し、モデルに変更を加え、それをlocalhostに再適用した後、この問題に遭遇しました。どうやら定義されたビュー(私が修正した)があったので、私は私のローカルバージョンを更新することができませんでした。

修正方法 (簡単に)

注:削除を伴うため、ビューに対しては正常に機能しますが、テーブルでこれを試す場合は必ずデータをバックアップしてください。

  1. Rootとしてデータベースにログインします(あるいは変更を加えるのに十分な権限を持つものなら何でも)。
  2. ビュー、テーブル、または問題があるものはすべて削除します。
  3. あなたの新しいモデルを同期させてください - それは今存在しない何かについて文句を言うことはありません。問題のあるアイテム定義から SQL SECURITY DEFINER partを削除することをお勧めします。

P.Sこれは適切な解決策ではありません。私はちょうどそれを可能な(そして非常に単純な)解決策として投稿しました。

1
Pijusn

MYSQLワークベンチ6.3コミュニティを使用してWindows 10にダンプをインポートした後、これが起こりました。「root @%は存在しません」。ユーザーが存在していても。最初にDEFINERをコメントアウトしようとしましたが、これはうまくいきませんでした。それから "root @%" の文字列を "root @ localhost" に置き換えてダンプを再インポートしました。これは私にとってトリックでした。

1
Dévan Coetzee

mysql.procが空の場合、システムは常にtable_nameに "[email protected].%"が存在しないことに気付き、mysqlのコマンドラインを起動して次のように入力します。

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

オーバー!

1
zhi.yang

データベースユーザーも大文字と小文字を区別するように思われるので、私はルート '@'%ユーザーを持っていましたが、私はルート '@'%ユーザーを持っていませんでした。ワークベンチでユーザーを大文字に変更し、問題は解決しました。

0
Metalmania

私は同じ問題のためにここに来ました、私は特定のユーザーが行動を起こしていた私のコードのどこにも見つけることができませんでした。どうやらそれは長い間削除された(dbは古いバージョンから復元された)ユーザーを使っていたトリガーからのものだったので、あなたが私のように戸惑った場合はdbイベント/トリガー/ルーチンを見てください。これが誰かに役立つことを願っています。

0
Dan Levin

//必要な既存のユーザーのすべてまたは特定のプロシージャを更新します1)UPDATE mysql.proc p SET definer = 'root @%' WHERE 1 = 1 LIMIT 1000;

2)新鮮な特権; //またはサーバーを再起動します

0
FantomX1

私の場合は、同じエラーが発生してデータを更新できないというそのテーブルに対するトリガーがありました。

MySQLエラー1449:定義者として指定されたユーザが存在しません

解決策は、そのテーブルのトリガを削除してから再作成することでした。これは、ホスティング会社を変更した後に新しいサーバでトリガが変更され、新しいサーバでユーザ名が変更されたためです。それは私の2セントです

0
Nassim

これを試してくださいこれは簡単な解決策です

mysql -u root -p
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

https://stackoverflow.com/a/42183702/5407056

0
Latief Anwar

さらに、TRIGGERSの定義者を変更するには(ALTERは機能しません)、次のようにします。

トリガーごとにDROPコマンドとCREATEコマンドを生成します。

SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "yourdatabase";

Foreachで実行してください。本番データベースを開発用マシンに持っていき、すべてのコマンドをforeachしてトリガーを自動的に再作成するときに、私は自分のアプリでこれを使用します。これにより、自動化することができます。

PHP/Laravelでの例:

    $this->info('DROP and CREATE TRIGGERS');
    $pdo = DB::connection()->getPdo();
    $sql = 'SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "mydatabase";';
    $stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $stmt->closeCursor();

    foreach($result as $rs){
        $pdo = DB::unprepared($rs['sqlCommand']);
        break;
    }

ヒント:MySQLバッファクエリの問題のため、pdoを使用して実行する必要があります。 ここ

0
ndberg