次のクエリを実行するとエラーが発生します。
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
なぜ私はそのエラーが出ますか?どうやって直すの?
これは通常、そのオブジェクトを作成したユーザーが存在しなくなったときに、あるデータベースまたはサーバーから別のデータベースまたはサーバーにビュー/トリガー/プロシージャーをエクスポートするときに発生します。
2つの選択肢があります。
これは、ダンプからDEFINER
ステートメントを削除することによって、データベースオブジェクトを最初にインポートするときに最も簡単に行うことができます。
定義者を後で変更するのは、もう少し注意が必要です。
このSQLを実行して必要なALTERステートメントを生成します。
SELECT CONCAT("ALTER DEFINER=`youruser`@`Host` VIEW ",
table_name, " AS ", view_definition, ";")
FROM information_schema.views
WHERE table_schema='your-database-name';
ALTERステートメントをコピーして実行する
例:
UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
これはすべてのデータベースのすべての定義者を変更するので注意してください。
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
アクセス許可を付与する必要があるのか、それともそれ以下でアクセスできるのかを検討してください。
SQLビューまたはプロシージャを最初に作成したユーザーは削除されました。そのユーザーを再作成した場合は、エラーに対処する必要があります。
私はmysqlを更新した後に同じエラーを得ました。
このコマンドの後にエラーが修正されました。
mysql_upgrade -u root
mySQLをアップグレードするたびにmysql_upgradeを実行する必要があります。現在のバージョンのMySQL Serverとの非互換性について、すべてのデータベースのすべてのテーブルをチェックします。テーブルに非互換性がある可能性があることが判明した場合は、チェックされます。問題が見つかった場合、テーブルは修復されます。 mysql_upgradeはシステムテーブルもアップグレードするので、追加された可能性がある新しい権限または機能を利用できます。
ユーザーが存在する場合、
mysql> flush privileges;
このようにして削除されたユーザーを作成します。
mysql> create user 'web2vi';
または
mysql> create user 'web2vi'@'%';
次の手順を実行します:
それが役に立てば幸い
解決策は、以下のように単一行のクエリです。
grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;
ROOT
をあなたのmysqlユーザー名に置き換えてください。PASSWORD
をあなたのmysqlパスワードに置き換えてください。
将来のgooglersのために:私はビューを含んでいないデータベースのテーブルを更新しようとしている同様のメッセージを得ました。少し掘り下げた後、私はそのテーブルのトリガーをインポートしたことが判明しました、そしてそれらは存在しないユーザーによって定義されたものでした。トリガーを落とすことで問題は解決しました。
以下のコメントを実行して修正してください。
grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;
some_other
の代わりにweb2vi
を取得している場合は、それに応じて名前を変更する必要があります。
ユーザ 'web2vi'はあなたのmysqlサーバに存在しません。
http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user を参照してください。
そのユーザーが存在する場合は、どのサーバーからアクセスできるかを確認します。これは別のエラーになると思いますが(例:web2vi @ localhostを使用しているが、web2vi @%としてdbにアクセスしている場合)
ファイルを回避してダンプするための簡単な修正:
mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
私は交換したとき私はそれが私のために働いたANSと同じ問題を抱えていた
root@%
によって
root@localhost
そのため、ユーザー「web2vi」が「localhost」からの接続を許可されている場合は、次のことを試すことができます。
web2vi@localhost
データベースにリモート接続しています。
これは私がDBをあるサーバーから別のサーバーに移動した後に起こりました。当初、定義者はlocalhostとユーザーを使用していました。新しいサーバーでは、そのユーザーとホストも変更されていません。私はその特定のテーブルのバックアップを取り、 phpmyadminからすべてのトリガーを手動で削除します 。その後、その作業は私にとっては問題ありません。
プロシージャをSECURITY INVOKER
として設定してみてください
Mysqlのデフォルトはプロシージャのセキュリティを "DEFINER"(CREATOR OF)に設定します。セキュリティを "invoker"に設定する必要があります。
私の5セント.
ビューから選択しようとしたときに同じエラーが発生しました。
しかし、問題は、このビューが、別のサーバーからのバックアップから復元された別のビューから選択されていることです。
そして実際には、はい、ユーザーは無効でしたが、最初の一見からどこへ行くべきか明らかではありませんでした。
grant all on *.* to 'username'@'%' identified by 'password' with grant option;
例:
grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
私の場合、テーブルには存在しないDEFINERユーザーとのトリガーがありました。
私は数分前にあなたと全く同じ問題を抱えていました、私は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
あなたのビュー "view_quotes"は、 "web2vi"が有効なユーザーである別のデータベースから "web2vi"が有効なユーザーではないデータベースにコピーされた可能性があります。
データベースに "web2vi"ユーザーを追加するか、ビューを変更します(通常はDEFINER = 'web2vi' @ '%'部分を削除してスクリプトを実行するとうまくいきます)。
これを試すことができます:
$ mysql -u root -p
> grant all privileges on *.* to `root`@`%` identified by 'password';
> flush privileges;
これがストアドプロシージャの場合は、次の操作を実行できます。
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時間を費やしました。しかし、私の場合、私はこれを実行しました:
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'を探します。
私の場合は、開発者の誰かが削除するのを忘れていたことが古い引き金になっていました。
MySQLリファレンスCREATE VIEW
:
DEFINER句とSQL SECURITY句は、ビューの呼び出し時にアクセス権限をチェックするときに使用されるセキュリティコンテキストを指定します。
このユーザーは存在していなければならず、常に「localhost」をホスト名として使用することをお勧めします。そのため、ユーザーが存在することを確認し、作成ビューで「localhost」に変更しても、このエラーは発生しません。
編集ルーチンセクションに行き、一番下で、セキュリティタイプを定義者から実行者に変更します。
他のユーザーによって作成または登録された1つまたは複数のビュー。あなたはビューの所有者をチェックしなければならないでしょう、そして:
'web2vi'
によって作成されたビューを再作成します。私は一度この問題を抱えていました。
SQLYogを使用して、ビューをBD1からBD2に移行しようとしていました。 SQLYogはビューを他のデータベース(DB2)に再作成しましたが、それはBD1のユーザーを保持しました(それらが異なる場合)。後になって、クエリで使用していたビューは、ビューを作成していなくても、あなたと同じエラーが発生していることに気付きました。
この助けを願っています。
問題は明らかです - MySQLは定義者として指定されたユーザーを見つけることができません。
開発サーバーからデータベースモデルを同期化し、それをlocalhostに適用し、モデルに変更を加え、それをlocalhostに再適用した後、この問題に遭遇しました。どうやら定義されたビュー(私が修正した)があったので、私は私のローカルバージョンを更新することができませんでした。
修正方法 (簡単に) :
注:削除を伴うため、ビューに対しては正常に機能しますが、テーブルでこれを試す場合は必ずデータをバックアップしてください。
P.Sこれは適切な解決策ではありません。私はちょうどそれを可能な(そして非常に単純な)解決策として投稿しました。
MYSQLワークベンチ6.3コミュニティを使用してWindows 10にダンプをインポートした後、これが起こりました。「root @%は存在しません」。ユーザーが存在していても。最初にDEFINERをコメントアウトしようとしましたが、これはうまくいきませんでした。それから "root @%" の文字列を "root @ localhost" に置き換えてダンプを再インポートしました。これは私にとってトリックでした。
mysql.procが空の場合、システムは常にtable_nameに "[email protected].%"が存在しないことに気付き、mysqlのコマンドラインを起動して次のように入力します。
CHECK TABLE `database`.`table_name` QUICK FAST MEDIUM CHANGED;
flush privileges;
オーバー!
データベースユーザーも大文字と小文字を区別するように思われるので、私はルート '@'%ユーザーを持っていましたが、私はルート '@'%ユーザーを持っていませんでした。ワークベンチでユーザーを大文字に変更し、問題は解決しました。
私は同じ問題のためにここに来ました、私は特定のユーザーが行動を起こしていた私のコードのどこにも見つけることができませんでした。どうやらそれは長い間削除された(dbは古いバージョンから復元された)ユーザーを使っていたトリガーからのものだったので、あなたが私のように戸惑った場合はdbイベント/トリガー/ルーチンを見てください。これが誰かに役立つことを願っています。
//必要な既存のユーザーのすべてまたは特定のプロシージャを更新します1)UPDATE mysql
.proc
p SET definer = 'root @%' WHERE 1 = 1 LIMIT 1000;
2)新鮮な特権; //またはサーバーを再起動します
私の場合は、同じエラーが発生してデータを更新できないというそのテーブルに対するトリガーがありました。
MySQLエラー1449:定義者として指定されたユーザが存在しません
解決策は、そのテーブルのトリガを削除してから再作成することでした。これは、ホスティング会社を変更した後に新しいサーバでトリガが変更され、新しいサーバでユーザ名が変更されたためです。それは私の2セントです
これを試してくださいこれは簡単な解決策です
mysql -u root -p
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
さらに、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を使用して実行する必要があります。 ここ