424

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

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

なぜそのエラーが発生するのですか? どうすれば修正できますか?

4

40 に答える 40

671

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

次の 2 つのオプションがあります。

1. DEFINER を変更する

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;

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

someuserこれは魔法のように機能しました -行方不明のユーザーの名前に変更するだけです。ローカル開発サーバーでは、通常、root.

また、実際にユーザーのALLアクセス許可を付与する必要があるかどうか、またはそれより少ない量でできるかどうかも検討してください。

于 2013-10-31T12:58:44.290 に答える
148

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

于 2012-05-01T17:08:02.347 に答える
45

次の手順を実行します:

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

それが役に立てば幸い

于 2016-03-01T05:00:41.820 に答える
39

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

mysql> flush privileges;
于 2013-01-09T21:24:46.570 に答える
36

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

mysql> create user 'web2vi';

また

mysql> create user 'web2vi'@'%';
于 2014-05-18T12:44:58.770 に答える
16

この次のコメントを実行することで修正されました。

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

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

于 2016-01-27T19:23:58.317 に答える
9

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

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
于 2016-01-11T11:17:06.610 に答える
7

ユーザー「web2vi」はmysqlサーバーに存在しません。

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

そのユーザーが存在する場合は、アクセスできるサーバーを確認しますが、別のエラーになると思います(たとえば、web2vi @ localhostがあるかもしれませんが、dbにweb2vi @%としてアクセスしています(とにかく)

于 2012-04-16T07:27:28.387 に答える
4

手順を次のように設定してみてください SECURITY INVOKER

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

于 2015-04-28T13:16:03.180 に答える
4

数分前にまったく同じ問題がありました.mysql.userテーブルから未使用のユーザーを削除した後、この問題に遭遇しましたが、ビューを変更すると修正されました。これは非常に簡単な便利なコマンドです:

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

これをmysqlコマンドラインと混ぜてください(Windowsに慣れていない* nixを想定しています):

> 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

于 2012-10-18T16:42:01.250 に答える
4

私の5セント。

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

ただし、別のサーバーからのバックアップから復元された別のビューから選択されたこのビューに問題があるようです。

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

于 2013-08-23T06:20:41.557 に答える
2

MySQLCREATE VIEWリファレンスから:

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

このユーザーは存在している必要があり、ホスト名として「localhost」を使用することをお勧めします。したがって、ユーザーが存在することを確認し、作成ビューで「localhost」に変更すると、このエラーは発生しないと思います。

于 2012-04-16T07:28:54.360 に答える
2

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

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

修正方法(簡単)

注:これには削除が含まれるため、ビューでは問題なく機能しますが、テーブルでこれを試す場合は、データがバックアップされていることを確認してください。

  1. root (または、変更を行うのに十分な権限を持つもの) としてデータベースにログインします。
  2. ビュー、テーブル、または問題を抱えているものをすべて削除します。
  3. 新しいモデルを同期します。現在存在しないものについて文句を言うことはありません。問題があった項目定義からSQL SECURITY DEFINER部分を削除することをお勧めします。

PS これは適切な修正でも、万能の修正でもありません。可能な(そして非常に単純な)解決策として投稿しました。

于 2012-12-25T15:04:53.060 に答える
1

これは、MYSQL Workbench 6.3 Community を使用して Windows 10 に「root@% が存在しない」というダンプをインポートした後に発生しました。ユーザーが存在していたにもかかわらず。最初に DEFINER をコメントアウトしようとしましたが、うまくいきませんでした。次に、 「root@%」の文字列を「root@localhost」に置き換え、ダンプを再インポートしました。これは私にとってはうまくいきました。

于 2016-12-05T06:51:21.247 に答える
1

次のことを試してください。

mysqldump --routines --single-transaction -u root -proot portalv3 > c:\portal.sql
于 2016-02-12T18:45:13.007 に答える
1

ルーチンの編集セクションに移動し、下部でセキュリティ タイプを定義者から呼び出し元に変更します。

于 2012-04-30T19:00:35.473 に答える
1

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

于 2016-01-25T14:17:18.383 に答える
1

私の場合、そのテーブルにトリガーがあり、データを更新できず、同じエラーが発生しました。

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

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

于 2015-12-07T15:16:29.217 に答える
1

私にとっては''、 DEFINER から を削除するとうまくいきました。
DEFINER = user@localhost

于 2021-08-29T09:26:23.597 に答える
0

データベース ユーザーも大文字と小文字が区別されるようです。そのため、root'@'% ユーザーは持っていましたが、ROOT'@'% ユーザーは持っていませんでした。ワークベンチを介してユーザーを大文字に変更したところ、問題は解決しました!

于 2015-05-14T12:33:18.130 に答える