次のクエリを実行するとエラーが発生します。
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 - 定義者として指定されたユーザー ('web2vi'@'%') が存在しません
なぜこのエラーが発生するのでしょうか? どうすれば修正できますか?
ベストアンサー1
これは通常、そのオブジェクトを作成したユーザーが存在しないため、あるデータベースまたはサーバーから別のデータベースまたはサーバーにビュー/トリガー/プロシージャをエクスポートするときに発生します。
次の 2 つのオプションがあります。
1. DEFINERを変更する
これは、データベース オブジェクトを最初にインポートするときに、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@%'
これにより、すべてのデータベースのすべての定義者が変更されるので注意してください。
2. 不足しているユーザーを作成する
MySQL データベースの使用中に次のエラーが見つかった場合:
The user specified as a definer ('someuser'@'%') does not exist`
次に、次のようにして解決できます。
GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password';
FLUSH PRIVILEGES;
MariaDb バージョン:
GRANT ALL PRIVILEGES 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
権限を付与する必要があるかどうか、または権限が少ないほうがよいかどうかも検討してください。