MySQL DEFINER の使用方法の詳細な説明

MySQL DEFINER の使用方法の詳細な説明

序文:

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 に関する注意事項についてお話しします。

  • SQL SECURITY 属性では、デフォルトの DEFINER を使用することが推奨されています。
  • ライブラリ内のビュー、関数、ストアド プロシージャには、統合された DEFINER ユーザーを使用することをお勧めします。
  • データベース ユーザーは関連オブジェクトの定義者である可能性があるため、簡単に変更または削除しないでください。
  • SQL SECURITY プロパティを変更する場合は、十分なテストを行い、変更前と変更後の違いを明確に理解してください。
  • データベースを移行するときは、新しい環境の関連オブジェクトの定義ユーザーに注意してください。
  • データベースを移行する場合は、まず新しい環境で関連するユーザーを作成し、権限を付与することをお勧めします。

要約:

この記事では、主にビュー、関数、ストアド プロシージャ、その他のオブジェクトを作成するときに遭遇し、見落とされがちな DEFINER に関連する知識を主に紹介します。しかし、これらの詳細には依然として注意を払う必要があり、実際に使用するときに多くの間違いを回避できるように、それらについてさらに学ぶ必要があります。

MySQL DEFINER の詳しい使い方については、これで記事は終了です。MySQL DEFINER に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Mysql 行番号() ソート関数の使い方と注意点
  • MySQL の暗黙的な型変換によって発生するインデックス障害の解決策
  • MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論
  • Django は MySQL マスター スレーブを構築して読み取りと書き込みの分離を実現します
  • MySQL マルチテーブル結合クエリの詳細な説明
  • MySQLデータベースの基礎を理解するのに役立つ記事
  • MySQL の group by と having の詳細な説明
  • Springbootバックエンドで複数のデータソースとMySQLデータベースを構成する便利な方法
  • MYSQL row_number() および over() 関数の詳細な使用方法

<<:  DOM操作テーブルの例(DOMはテーブルを作成します)

>>:  Vue+Openlayerはグラフィックスのドラッグと回転変形効果を実現します

推薦する

キャンバスをベースにした超クールな水光効果を実現

この記事の例では、キャンバスをベースにした超クールな水の光の効果を実装するための具体的なコードを参考...

JS での矢印関数と this の記述と理解

目次序文1. JSで関数を書く方法1. 通常の関数の書き方2. 矢印関数の書き方2. 通常の関数でこ...

eCharts でパーセンテージ付きの横棒グラフを実装する方法

目次サンプルコードレンダリングコード分​​析要約するサンプルコード var データ = [220, ...

dockerでifconfigが利用できない問題を解決する

最近、docker を学習していたときに、docker コンテナ内のネットワーク状態を照会するために...

MySQL の簡単な分析 - MVCC

バージョンチェーンInnoDB エンジン テーブルでは、クラスター化インデックス レコードに 2 つ...

React+TypeScriptプロジェクト構築事例解説

React プロジェクトの構築は非常に簡単ですが、Typescript と組み合わせると、実際にはそ...

JavaScript イベント委任の原則

目次1. イベント委任とは何ですか? 2. イベント委任の原則3. イベント委託の役割1. イベント...

Q&A: XML と HTML の違い

Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...

HTML入門チュートリアル HTMLタグ記号をすぐにマスター

補足<br />HTML について何も知らず、HTML の始め方がまだわからない場合は、...

Windows で MySQL 5.6 を 5.7 にアップグレードする方法

前面に書かれたMySQL をアップグレードする方法には、インプレース アップグレードと論理アップグレ...

MySQL 起動時に「サーバーは PID ファイルを更新せずに終了しました」というエラーが報告される理由の詳細な分析

多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...

MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要

この記事では、例を使用して、MySQL のさまざまな一般的な結合テーブルクエリについて説明します。ご...

Centos7 に PHP と Nginx をインストールする詳細なチュートリアル

Centos のサーバー側への適用がますます普及するにつれて、Centos7 もますます使用されるよ...

VUE 入門 イベント処理の学習

目次1. 関数バインディング2. パラメータと$eventを使用する3. 1つのイベントに複数の関数...