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はグラフィックスのドラッグと回転変形効果を実現します

推薦する

Windows 10 で MySQL を完全にアンインストールして再インストールするための詳細な手順

さまざまな理由で、誰もが MySQL を再インストールする必要があると思います。 MySQL と Q...

MySQL スロークエリログの詳細な理解

目次スロークエリログとは何ですか?スロークエリを有効にする方法ログ分析ツール mysqldumpsh...

CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する例

テーマ今日は、CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する方法を説...

Windows 10 Home EditionにDockerをインストールする方法を教えます

Redisの本やSpring Cloud Alibabaの本を執筆した際に、一部の分散コンポーネント...

Nginx の純粋な構成でリアルタイム ログ レポートを実現するためのアイデアと方法

目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...

JavaScriptはクリックするとランダムなグラフィックを生成します

この記事では、クリックするとランダムグラフィックの生成を実現するJavaScriptの具体的なコード...

フロントエンド HTML+CSS+JS を使用してシンプルな TODOLIST 関数を開発する (メモ帳)

目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...

MySQL全文検索の使用例

目次1. 環境整備2. データの準備3. ショーを始める4. 単語分割エンジン要約する参考文献1. ...

Linux 7.6 バイナリに MySQL 8.0.27 をインストールする詳細な手順

目次1. 環境整備1.1 オペレーティング システムのバージョン1.2 ディスク容量1.3 ファイア...

C# は MySQL コマンドラインのバックアップとリカバリを実装します

MySQL データベースをバックアップするためのツールは多数あります。過去 2 日間で、C# を使用...

CSS3 で背景ぼかしを実現する 3 つの方法 (要約)

1. 通常の背景ぼかしコード: <スタイル> html, 体 { 幅: 100%; 高...

Ubuntu で VIM を C++ 開発エディタとして設定する

1. 設定ファイルをユーザー環境にコピーし、新しい.vimフォルダを作成し、バンドルサブフォルダを作...

Docker で MySQL サービスをデプロイする方法と、遭遇する落とし穴

最近、ポーターを学んでいます。こんなに強力なものがあったなんて、今まで知らなかった気がします。クラス...

Vue ログインページ用の動的パーティクル背景プラグインの実装

目次動的パーティクル効果は次のとおりです。プラグインをインストールする動的パーティクル効果は次のとお...

MySQL データベース グループ クエリの group by ステートメントの詳細な説明

1: グループ化関数の記述順序 1 選択 ... 2 から ... 3 どこで ... 4 グループ...