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


353

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

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

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


7
SHOW CREATE VIEW 'view_quotes'を見せてください
jordeu

エラーは、view_quotesビューの条件のいずれかにある必要があります。
Shell

これについて少し考えた後、最も簡単な方法は、不足しているアカウントをデータベースに追加することで、エラーは解消しました。複雑な手順は必要ありません。アカウントを追加できる場合は、まずそれを試してください。
user1794918 2018

回答:


540

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

次の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;

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

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

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


1
および付与オプションは必要ありません。
2014年

@Simon East:素敵な編集を行いました。回答を改善していただき、ありがとうございます。
Chococroc 2016年

私は、「UPDATE実行した後、再起動MySQLインスタンスを追加することをお勧めmysqlproc手続きに定義者のみが、その後更新されますので、 『%@ルート』 P SET定義= 『ユーザー%@』定義=を」クエリを。
ヨハン

1
意味のないユーザーを追加する方が簡単だと思います。次回dbdumpを実行してインポートするときに、ビュー/プロシージャの編集を再度行う必要がないためです
DarkMukke

1
ありがとう、問題のあるテーブルを削除し、を削除しDEFINER=`user`@`host`て再インポートしました。魅力のように働いた。:ok_hand:
giovannipds

139

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


3
さらに、追加したユーザーに少なくともSELECTおよびEXECUTE権限を付与する必要があります。あるサーバーから別のサーバーにDBバックアップをエクスポートし、ルーチンを作成したユーザーがテストサーバーに存在しない場合に、この問題に遭遇しました。
drew010

5
ありがとう、これは役に立ちました。多くの場合、mysqldumpを使用して移行またはデプロイする場合、VIEW、TRIGGER、またはPROCEDURE(定義者)を作成したユーザーがターゲットシステムで同じでない場合があります。その場合、ターゲットシステムで有効なユーザーを使用して、プロシージャ、トリガー、または表示(DROPそして再CREATE)を再作成するだけでうまくいくはずです。
Eric Kigathi 2013

38
あなたはまた、定義者が既存のユーザーに誰であるか変更することができますUPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';

1
ちょうど私の場合、削除されたDEFINERユーザーを指すトリガーを持つテーブルがありました。トリガーユーザーを更新することで問題は解決しました。
ミゲル

そのユーザーに許可を与える必要もあります:) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor

50

mysqlを更新した後、同じエラーが発生しました。

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

mysql_upgrade -u root

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


これがうまくいかなかった理由がわからないので、手動でmySQLワークベンチのすべてのトリガーを削除する必要がありました。
user752746


34

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

mysql> create user 'web2vi';

または

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

3
失われたユーザーを作成した後、別のエラーが発生しました:ユーザーの作成後ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'にこのコマンドを追加grant all on *.* to 'web2vi'@'%' identified by ''する必要があります
zhuguowei

31

次の手順を実行します:

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

それが役に立てば幸い


1
これは、ユーザーを作成して権限を付与するのではなく、質問に対する実際の解決策です。定義者を変更するだけです。
Ankit Chauhan

データベース内のすべてのトリガーを見つける方法はありますか?
Mrugesh Mistry

1
すべてのトリガーを検索:SHOW TRIGGERS
JerzySkalski

コマンドライン 'show triggerss'から、PhpMyAdminからデータベースを選択し、ナビゲーションバーの右上にあるトリガーをクリックします
hussainfrotan

21

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

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

ROOTmysqlユーザー名に置き換えます。PASSWORDmysqlパスワードに置き換えます。


1
注意:MySQLユーザーは大文字と小文字を区別します。
Alessio Cantarella

私はflush privilegesこの後にする必要があり、それは機能します。ありがとう。
ビクター

14

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

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

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


13

今後のGoogle社員向け:ビューを含まないデータベースのテーブルを更新しようとする同様のメッセージが表示されました。少し調べたところ、そのテーブルにトリガーをインポートしたことがわかりました。これらは存在しないユーザーによって定義されたものです。トリガーを削除すると、問題が解決しました。


トリガーが問題でした。トリガーセクションで定義を更新しました。これ以上の問題はありません。
Darius

ありがとう、それはとても役に立ちます。また、ビューを更新する必要があります。
toxxxa 2015年

確かに非常に役に立ちます:)私はそれだけでは決して見つかりません。
ElChupacabra 2016年

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 @%としてアクセスしています(いつでも)


7

ファイルを回避してダンプするためのクイックフィックス:

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

1
これは動作しません。定義者はダンプに含まれています。
phil294 2017

「d」の代わりに「p」を使用してmysqlpumpを使用する場合、-skip-definerを使用できます
Wouter

@lyhong詳細な説明はありませんが--single-transaction、ダンプ中にLock Tablesが実装される方法を明らかに変更します。またはそのようなもの。どこで読んだか覚えていませんが、「旗を投げるだけ」で安心できました。私はまた、説明のつかない「これをやる」「答え」に不安を感じています。どちらにせよ、それは私の場合にはうまくいきました。
SherylHohman

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

例:

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

すべての権限を「ユーザー」@「すべてのIP」に付与すると、セキュリティはどうなりますか?
Mohsen Abasi 2018

@MohsenAbasiこれは開発環境の例です。このユーザーは、システム管理者になることができます。製品環境はもっと注意する必要があります。
メストピスキン

7

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


ヒントをありがとう、手動でmySQLワークベンチのすべてのトリガーを削除することができました。
user752746

これは私がすべてのそれらを削除して再作成しなければならなかった、私のために実際のトリガの問題だった
paul.ago

トリガーを再作成する以外の解決策はありますか?1日2回テストダンプを使用することがあります。これは私の主なプロセスを混乱させるでしょう
redestructa

@TS Guhanトリガーを手動で削除した後、トリガーを再度追加しましたか?
MailBlade

6

私が置き換えたときにそれが私のために働いたrootユーザーと同じ問題がありました

root@%

沿って

root@localhost

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

web2vi@localhost

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


4

私の5セント。

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

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

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


4

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

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


4

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

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


3

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


3

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


2
アプリがサーバーから別のサーバーに転送されるときに、特に爪の上で
zardilior

2

MySQLのリファレンスCREATE VIEW

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

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


2

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

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

修正方法(簡単)

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

  1. ルートとしてデータベースにログインします(または変更を行うのに十分な権限を持つものであれば何でも)。
  2. ビュー、テーブル、または問題のあるものをすべて削除します。
  3. 新しいモデルを同期します。現在存在しないものについて不満を言うことはありません。問題があったアイテム定義からSQL SECURITY DEFINER部分を削除することができます。

PSこれは適切な修正でも、万能の修正でもありません。私はそれを可能な(そして非常に単純な)ソリューションとして投稿しました。


私はヒキガエルを使用していますが、ターミナルからrooyとしてログインし、その後に実行する必要があるのはosのみを使用して削除および再作成しますか?
Vasanth Nag KV 2014

2

あなたはこれを試すことができます:

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

2

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

私はこのような問題の決定を見つける前に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

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


4
どこへ行く?どのソフトウェアで?
kenorb 2013年

@ kenorb、phpMyAdminで、セキュリティタイプなどのMySQLストアドルーチン(手順と関数)を変更できます。
Mikl 2015

1

別のユーザーが作成/登録した1つまたは複数のビュー。ビューの所有者を確認し、次のことを行う必要があります。

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

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

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

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


1

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

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

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

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

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

SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、 'mytable'の近くで 'grant all on'を使用するための正しい構文を確認してください。1行目
Cerin、2014年

@ Cerin、mytableの周りの ''を ``に変更するだけです。私の答えは、この問題を抱えている人々を助けることを目的としています。あなたの反対票を再考することを考えてください..
Helpe

1

mysql.procが空であるが、システムは常にtable_nameの「user@192.168.%」が存在しないことに気づく場合、mysqlコマンドラインでrootにして次のように入力します。

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

以上!


1

これは、MYSQL Workbench 6.3コミュニティを含むWindows 10に「root @%が存在しない」というダンプをインポートした後に発生しました。ユーザーが存在していても。最初に、DEFINERをコメントアウトしようとしましたが、これは機能しませんでした。次に、「root @%」「root @ localhost」で文字列置換し、ダンプを再インポートしました。これは私にとってはトリックでした。



0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.