序文: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はグラフィックスのドラッグと回転変形効果を実現します
この記事の例では、キャンバスをベースにした超クールな水の光の効果を実装するための具体的なコードを参考...
目次序文1. JSで関数を書く方法1. 通常の関数の書き方2. 矢印関数の書き方2. 通常の関数でこ...
目次サンプルコードレンダリングコード分析要約するサンプルコード var データ = [220, ...
最近、docker を学習していたときに、docker コンテナ内のネットワーク状態を照会するために...
バージョンチェーンInnoDB エンジン テーブルでは、クラスター化インデックス レコードに 2 つ...
React プロジェクトの構築は非常に簡単ですが、Typescript と組み合わせると、実際にはそ...
目次1. イベント委任とは何ですか? 2. イベント委任の原則3. イベント委託の役割1. イベント...
Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...
補足<br />HTML について何も知らず、HTML の始め方がまだわからない場合は、...
1.コンテナ内の /etc/hosts、/etc/resolv.conf、/etc/hostname...
前面に書かれたMySQL をアップグレードする方法には、インプレース アップグレードと論理アップグレ...
多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...
この記事では、例を使用して、MySQL のさまざまな一般的な結合テーブルクエリについて説明します。ご...
Centos のサーバー側への適用がますます普及するにつれて、Centos7 もますます使用されるよ...
目次1. 関数バインディング2. パラメータと$eventを使用する3. 1つのイベントに複数の関数...