序文:MySQL データベースでビューや関数を作成するときに、definer オプションに注目したことがありますか?ビューまたは関数の移行後にエラーが発生した場合、これらは実際には定義者に関連している可能性があります。この記事では主にMySQLにおけるdefinerの意味と機能について紹介します。 1.DEFINERの簡単な紹介ビューを例に、ビューを作成するための公式の基本構文を見てみましょう。 作成する [または置換] [アルゴリズム = {未定義 | マージ | テンプテーブル}] [定義者 = ユーザー] [SQL セキュリティ { 定義者 | 呼び出し者 }] VIEW ビュー名 [(列リスト)] AS 選択ステートメント [[カスケード | ローカル] チェック オプションあり] 上記の構文をよく見ると、definer が 2 回出現していることがわかります。1 回は DEFINER = user に、もう 1 回は SQL SECURITY オプション (DEFINER または INVOKER に設定可能) に出現します。definer の機能を推測できましたか? Definer を中国語に翻訳すると「定義者」という意味になります。 MySQL では、ビュー、関数、ストアド プロシージャ、トリガー、またはイベントを作成するときに、オブジェクトを定義するユーザーを指定する DEFINER = user オプションを指定できます。明示的に指定されていない場合は、オブジェクトを作成したユーザーが定義者になります。 ビュー、関数、およびストアド プロシージャの場合は、SQL SECURITY 属性を指定することもできます。この属性の値は、実行時に誰の権限が使用されるかを示す DEFINER (定義者) または INVOKER (呼び出し者) にすることができます。 DEFINER はプログラムが定義者の権限で実行されることを意味し、INVOKER はプログラムが呼び出し者の権限で実行されることを意味します。 デフォルトでは、SQL SECURITY 属性は DEFINER です。値が DEFINER の場合、DEFINER で指定された定義者ユーザーがデータベース内に存在し、定義者ユーザーには参照される関連オブジェクトに対する対応する操作権限と権限が必要です。実行者には、正常に実行するための呼び出し権限のみが必要です。 SQL SECURITY 属性が INVOKER の場合、実行者が呼び出し権限と参照される関連オブジェクトの権限を持っている場合にのみ、実行は成功します。 簡単に言うと、ビューが 3 つのテーブル abc をクエリするとします。このビューの SQL SECURITY 属性が DEFINER の場合、ユーザー u がこのビューをクエリするときに、ユーザー u に必要なのは、このビューのクエリ権限のみです。このビューの SQL SECURITY 属性が INVOKER の場合、ユーザー u には、このビューのクエリ権限と 3 つのテーブル abc のクエリ権限が必要です。次の例はこれを詳細に示しています。 # 2 つのビューを作成します。両方とも testuser によって定義されます。クエリは test_tb テーブルに対して実行されます。mysql> show grants for 'testuser'@'%'; +------------------------------------------------------------------------------------------------------------------------+ | testuser@% への権限付与 | +------------------------------------------------------------------------------------------------------------------------+ | 'testuser'@'%' に *.* の使用権限を付与 | | 'testuser'@'%' に `testdb`.* に対する SELECT、INSERT、UPDATE、DELETE、CREATE、CREATE VIEW、SHOW VIEW 権限を付与します | +------------------------------------------------------------------------------------------------------------------------+ セット内の 2 行 (0.00 秒) mysql> 表示作成ビュー view_definer\G ************************** 1. 行 **************************** ビュー: view_definer ビューの作成: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY DEFINER VIEW `view_definer` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb` 文字セットクライアント: utf8mb4 照合接続: utf8mb4_general_ci セット内の 1 行 (0.00 秒) mysql> 表示作成ビュー view_invoker\G ************************** 1. 行 **************************** 表示: view_invoker ビューの作成: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY INVOKER VIEW `view_invoker` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb` 文字セットクライアント: utf8mb4 照合接続: utf8mb4_general_ci セット内の 1 行 (0.00 秒) # クエリテストを実行するには、uview ユーザーにのみこれらの 2 つのビューをクエリする権限を付与します。mysql> select user(); +-----------------+ | ユーザー() | +-----------------+ | uview@localhost | +-----------------+ セット内の 1 行 (0.00 秒) mysql> 権限を表示します。 +--------------------------------------------------------+ | uview@% への助成金 | +--------------------------------------------------------+ | 'uview'@'%' に *.* の使用権限を付与 | | `testdb`.`view_definer` に対する 'uview'@'%' への SELECT 権限を付与します | | `testdb`.`view_invoker` に対する 'uview'@'%' への SELECT 権限を付与します | +--------------------------------------------------------+ セット内の 3 行 (0.00 秒) mysql> view_definer から * を選択します。 +--------+-----------+ | スタッフID | スタッフ名 | +--------+-----------+ | 1001 | 1 から | | 1002 | dfsfd | | 1003 | dgfg | +--------+-----------+ セット内の行数は 9 です (0.00 秒) mysql> view_invoker から * を選択します。 エラー 1356 (HY000): ビュー 'testdb.view_invoker' は無効なテーブル、列、関数を参照しているか、ビューの定義者/呼び出し者にそれらを使用する権限がありません # 結果として、view_definer クエリは正常ですが、uview ユーザーに test_tb テーブルに対するクエリ権限がないため、view_invoker クエリは実行できません。 カスタム関数とストアド プロシージャは似ています。SQL SECURITY 属性が INVOKER の場合、正常に実行するには、呼び出し元に実行権限と参照先オブジェクトに対する権限が必要です。 2. いくつかの注意点追加の知識ポイント: 作成権限と SUPER 権限を持つユーザーのみが、DEFINER = 他のユーザーでオブジェクトを作成できます。たとえば、root アカウントは DEFINER = testuser でビューを作成できますが、testuser はビューが作成されている場合にのみ、独自の DEFINER でビューを作成できます。 DEFINER の役割をより詳しく理解するために、ビューを例にとり、特殊なケースの例をいくつか示してみましょう。 ユーザー u1 が存在しないと仮定します。ルート アカウントを使用して、DEFINER = u1 のビューを作成できます。ビューの SQL SECURITY 属性が DEFINER の場合、クエリ時にユーザーが存在しないことを示すエラーが報告されます。ビューの SQL SECURITY 属性が INVOKER の場合、ルート アカウントはビューを通常どおりクエリできます。 ユーザー u2 は存在するが、テーブル a をクエリする権限がないと仮定します。ルート アカウントを使用して、DEFINER = u2 でビューを作成し、テーブル a をクエリできます。ビューの SQL SECURITY 属性が DEFINER の場合、クエリ中に権限がないことを示すエラーが報告されます。ビューの SQL SECURITY 属性が INVOKER の場合、ルート アカウントを使用してビューを正常にクエリできます。ユーザー u2 としてログインし、テーブル a を照会するビューを作成すると、権限不足エラーが直接報告されます。つまり、このビューの SQL SECURITY 属性が何であっても、テーブル a を照会するビューは作成できません。 上記の例を読んでも、DEFINER についてより明確に理解できたかどうかはわかりません。興味のある学生は自分でテストすることができます。私の日々の経験を踏まえて、DEFINER に関する注意事項についてお話しします。
要約:この記事では、主にビュー、関数、ストアド プロシージャ、その他のオブジェクトを作成するときに遭遇し、見落とされがちな DEFINER に関連する知識を主に紹介します。しかし、これらの詳細には依然として注意を払う必要があり、実際に使用するときに多くの間違いを回避できるように、それらについてさらに学ぶ必要があります。 MySQL DEFINER の詳しい使い方については、これで記事は終了です。MySQL DEFINER に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: DOM操作テーブルの例(DOMはテーブルを作成します)
>>: Vue+Openlayerはグラフィックスのドラッグと回転変形効果を実現します
さまざまな理由で、誰もが MySQL を再インストールする必要があると思います。 MySQL と Q...
目次スロークエリログとは何ですか?スロークエリを有効にする方法ログ分析ツール mysqldumpsh...
テーマ今日は、CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する方法を説...
Redisの本やSpring Cloud Alibabaの本を執筆した際に、一部の分散コンポーネント...
目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...
この記事では、クリックするとランダムグラフィックの生成を実現するJavaScriptの具体的なコード...
目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...
目次1. 環境整備2. データの準備3. ショーを始める4. 単語分割エンジン要約する参考文献1. ...
目次1. 環境整備1.1 オペレーティング システムのバージョン1.2 ディスク容量1.3 ファイア...
MySQL データベースをバックアップするためのツールは多数あります。過去 2 日間で、C# を使用...
1. 通常の背景ぼかしコード: <スタイル> html, 体 { 幅: 100%; 高...
1. 設定ファイルをユーザー環境にコピーし、新しい.vimフォルダを作成し、バンドルサブフォルダを作...
最近、ポーターを学んでいます。こんなに強力なものがあったなんて、今まで知らなかった気がします。クラス...
目次動的パーティクル効果は次のとおりです。プラグインをインストールする動的パーティクル効果は次のとお...
1: グループ化関数の記述順序 1 選択 ... 2 から ... 3 どこで ... 4 グループ...