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

推薦する

Element UI を使用してページにページング ナビゲーション バーを追加する方法

必要ページング バーを追加します。これにより、ページにジャンプしたり、ページ番号に従って特定のページ...

MySQL エラー コード 1064 の解決策

SQL ステートメント内の単語が mysql のキーワードと競合する場合は、`` (タブ キーの上)...

Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体

1. Expressライブラリとジェネレータをインストールするcmdを開いて、次のコマンドを入力しま...

テーブルの4辺を上下左右にスクロールするように固定する方法

質問:最近、プロジェクトの統計を行っていたときに、テーブルを上下にスクロールしたときにテーブルの先頭...

CSSスコープ(スタイル分割)の使用の概要

1. CSSスコープの使用(スタイル分割) Vue では、CSS スタイルを現在のコンポーネントでの...

画像の一時停止を実現するjQueryプラグイン

この記事では、画像の一時停止を実現するためのjQueryプラグインの具体的なコードを参考までに共有し...

ネガティブマージン関数の紹介と使用方法の概要

1998 年の CSS2 勧告の時点で、テーブルは徐々に舞台から消え、歴史の中に記録されるようになり...

Javascript の基礎: 演算子とフロー制御の詳細な説明

目次1. オペレーター1.1 算術演算子1.2 インクリメント演算子とデクリメント演算子1.3 比較...

MySQL ベストプラクティス: パーティションテーブルの基本タイプ

MySQL パーティションテーブルの概要MySQL の人気が高まるにつれて、MySQL に保存される...

CSS 動的高さ遷移アニメーション効果の実装

この質問は、Nuggets のメッセージから生まれました。友人が、次のコードの高さ遷移アニメーション...

JavaScript strictモードの概要 strictを使用する

目次1. 概要1.1 厳密モードとは何ですか? 1.2 厳密モードの目的2. 厳密モードを有効にする...

IE6 の歪み問題

質問: <form...> の下の <input type="hidde...

MySQL 全体または単一のテーブルデータのエクスポート

単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...

GaussDB for MySQL パフォーマンス最適化の詳細な説明

目次背景インスピレーションは人生から生まれる速達配送の最適化原則GaussDB の最適化 (MySQ...

地域のカスタムカラーのためのechars 3Dマップソリューション

目次質問伸ばす問題を解決する要約する質問プロジェクトの要件に従って、以下の州地図で個々の都市を(異な...