MySQL 8.0 リファレンスマニュアル


13.7.1.6 GRANT ステートメント

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]
    [AS user
        [WITH ROLE
            DEFAULT
          | NONE
          | ALL
          | ALL EXCEPT role [, role ] ...
          | role [, role ] ...
        ]
    ]
}

GRANT PROXY ON user_or_role
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]

GRANT role [, role] ...
    TO user_or_role [, user_or_role] ...
    [WITH ADMIN OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

user_or_role: {
    user (see セクション6.2.4「アカウント名の指定」)
  | role (see セクション6.2.5「ロール名の指定」)
}

GRANT ステートメントは、MySQL のユーザーアカウントおよびロールに権限およびロールを割り当てます。 次のトピックで説明するように、GRANT ステートメントにはいくつかの側面があります:

GRANT の一般概要

GRANT ステートメントを使用すると、システム管理者は、ユーザーアカウントおよびロールに付与できる権限およびロールを付与できます。 次の構文制限が適用されます:

  • GRANT では、権限とロールの両方の付与を同じステートメントに混在させることはできません。 特定の GRANT ステートメントでは、権限またはロールのいずれかを付与する必要があります。

  • ON 句は、ステートメントによって権限が付与されるかロールが付与されるかを区別します:

    • ON では、ステートメントによって権限が付与されます。

    • ON がない場合、ステートメントはロールを付与します。

    • 権限とロールの両方をアカウントに割り当てることはできますが、付与する内容に適した構文を持つ個別の GRANT ステートメントを使用する必要があります。

ロールの詳細は、セクション6.2.10「ロールの使用」 を参照してください。

GRANT で権限を付与するには、GRANT OPTION 権限および付与する権限が必要です。 (または、mysql システムスキーマ内の付与テーブルに対する UPDATE 権限を持っている場合は、任意のアカウントに任意の権限を付与できます。) read_only システム変数が有効になっている場合、GRANT にはさらに CONNECTION_ADMIN 権限 (または非推奨の SUPER 権限) が必要です。

GRANT は、指定されたすべてのユーザーおよびロールに対して成功するか、ロールバックされ、エラーが発生しても効果はありません。 ステートメントは、指定されたすべてのユーザーおよび役割で成功した場合にのみバイナリログに書き込まれます。

REVOKE ステートメントは GRANT に関連しており、管理者がアカウントの権限を削除できるようにします。 セクション13.7.1.8「REVOKE ステートメント」を参照してください。

各アカウント名には、セクション6.2.4「アカウント名の指定」で説明されている形式が使用されます。 各ロール名は、セクション6.2.5「ロール名の指定」 で説明されている形式を使用します。 例:

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';

アカウント名またはロール名のホスト名部分は、省略すると'%'にデフォルト設定されます。

通常、データベース管理者は最初に CREATE USER を使用してアカウントを作成し、その非権限特性 (パスワード、セキュアな接続を使用するかどうか、サーバーリソースへのアクセス制限など) を定義してから、GRANT を使用してその権限を定義します。 ALTER USER を使用して、既存のアカウントの非権限特性を変更できます。 例:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

正常に実行されると、GRANTmysql プログラムから Query OK, 0 rows affected で応答します。 この操作によってどのような権限が付与されたかを判定するには、SHOW GRANTS を使用します。 セクション13.7.7.21「SHOW GRANTS ステートメント」を参照してください。

重要

状況によっては、GRANT がサーバーログ、またはクライアント側にある ~/.mysql_history などの履歴ファイル内に記録されることがあります。つまり、平文のパスワードが、その情報に対する読み取りアクセス権を持つ任意のユーザーによって読み取られる可能性があります。 これがサーバーログで発生する条件およびこれを制御する方法については、セクション6.1.2.3「パスワードおよびロギング」を参照してください。 クライアント側のロギングに関する同様の情報については、セクション4.5.1.3「mysql クライアントロギング」を参照してください。

GRANT では、255 文字までのホスト名 (MySQL 8.0.17 より前の 60 文字) がサポートされます。 ユーザー名には、最大 32 文字を指定できます。 データベース、テーブル、カラム、およびルーチン名には、最大 64 文字を指定できます。

警告

Do は、mysql.user システムテーブルを変更しても、ユーザー名に許可されている長さを変更しようとしません。 これを行うと、予期しない動作が発生し、ユーザーが MySQL server にログインできなくなることもあります。 セクション2.11「MySQL のアップグレード」 で説明されている手順以外の方法で、mysql システムスキーマ内のテーブルの構造を変更しないでください。

オブジェクト見積ガイドライン

多くの場合、引用符はオプションですが、GRANT ステートメント内のいくつかのオブジェクトは引用の対象となります: アカウント名、ロール名、データベース名、テーブル名、カラム名およびルーチン名。 たとえば、アカウント名の user_name または host_name の値が引用符で囲まれていない識別子として有効な場合、引用符で囲む必要はありません。 ただし、特殊文字 (- など) を含む user_name 文字列、または % などの特殊文字やワイルドカード文字を含む host_name 文字列 ('test-user'@'%.com'など) を指定するには、引用符が必要です。 ユーザー名とホスト名は個別に引用符で囲みます。

引用符で囲まれた値を指定するには:

  • データベース名、テーブル名、カラム名およびルーチン名を識別子として引用符で囲みます。

  • ユーザー名とホスト名は識別子または文字列として引用符で囲みます。

  • パスワードは文字列として引用符で囲みます。

文字列および識別子として引用符で囲む方法のガイドラインについては、セクション9.1.1「文字列リテラル」およびセクション9.2「スキーマオブジェクト名」を参照してください。

_および % のワイルドカードは、データベースレベル (GRANT ... ON db_name.*) で権限を付与する GRANT ステートメントでデータベース名を指定する場合に使用できます。 つまり、たとえば、_文字をデータベース名の一部として使用するには、GRANT ステートメントで\_として指定し、ワイルドカードパターンに一致する追加のデータベース (GRANT ... ON `foo\_bar`.* TO ... など) にユーザーがアクセスできないようにします。

データベース名を使用してデータベースレベルで権限を付与せず、テーブルやルーチン (GRANT ... ON db_name.tbl_name など) などの他のオブジェクトに権限を付与する修飾子として使用すると、ワイルドカード文字は通常の文字として扱われます。

アカウント名

GRANT ステートメントの user 値は、そのステートメントが適用される MySQL アカウントを示します。 任意のホストからのユーザーへの権限の付与に対応するために、MySQL では、'user_name'@'host_name'形式での user 値の指定がサポートされています。

ホスト名には、ワイルドカードを指定できます。 たとえば、'user_name'@'%.example.com'example.com ドメイン内の任意のホストの user_name に適用され、' user_name '@'198.51.100.%'198.51.100 クラス C サブネット内の任意のホストの user_name に適用されます。

単純な形式の'user_name'は、'user_name'@'%'のシノニムです。

MySQL は、ユーザー名でのワイルドカードをサポートしていません。 匿名ユーザーを参照するには、GRANT ステートメントで空のユーザー名を含むアカウントを指定します。

GRANT ALL ON test.* TO ''@'localhost' ...;

この場合、匿名ユーザーの正しいパスワードを使用してローカルホストから接続するユーザーは、匿名ユーザーアカウントに関連付けられた権限を使用してアクセスを許可されます。

アカウント名内のユーザー名とホスト名の値の詳細は、セクション6.2.4「アカウント名の指定」を参照してください。

警告

ローカル匿名ユーザーに MySQL サーバーへの接続を許可する場合は、'user_name'@'localhost'としてすべてのローカルユーザーにも権限を付与する必要があります。 それ以外の場合は、指定されたユーザーがローカルマシンから MySQL サーバーにログインしようとすると、mysql.user システムテーブルの localhost の匿名ユーザーアカウントが使用されます。 詳細は、セクション6.2.6「アクセス制御、ステージ 1: 接続の検証」を参照してください。

この問題が適用されるかどうかを判断するには、匿名ユーザーをリストする次のクエリーを実行します:

SELECT Host, User FROM mysql.user WHERE User='';

今説明した問題を回避するには、次のステートメントを使用して、ローカルの匿名ユーザーアカウントを削除します。

DROP USER ''@'localhost';
MySQL によってサポートされる権限

次のテーブルに、GRANT および REVOKE ステートメントに指定できる静的および動的な priv_type 権限タイプと、各権限を付与できるレベルをまとめます。 各権限の詳細は、セクション6.2.2「MySQL で提供される権限」 を参照してください。 静的権限と動的権限の違いの詳細は、静的権限と動的権限 を参照してください。

表 13.11 GRANT および REVOKE に許可される静的権限

権限 意味と付与可能なレベル
ALL [PRIVILEGES] GRANT OPTION および PROXY を除くすべての権限を指定されたアクセスレベルで付与します。
ALTER ALTER TABLE の使用を有効にします。 レベル: グローバル、データベース、テーブル。
ALTER ROUTINE ストアドルーチンの変更または削除を有効にします。 レベル: Global, database, routine.
CREATE データベースおよびテーブルの作成を有効にします。 レベル: グローバル、データベース、テーブル。
CREATE ROLE ロール作成を有効にします。 レベル: グローバル。
CREATE ROUTINE ストアドルーチンの作成を有効にします。 レベル: グローバル、データベース。
CREATE TABLESPACE テーブルスペースおよびログファイルグループの作成、変更、または削除を有効にします。 レベル: グローバル。
CREATE TEMPORARY TABLES CREATE TEMPORARY TABLE の使用を有効にします。 レベル: グローバル、データベース。
CREATE USER CREATE USERDROP USERRENAME USER、および REVOKE ALL PRIVILEGES の使用を有効にします。 レベル: グローバル。
CREATE VIEW ビューの作成または変更を有効にします。 レベル: グローバル、データベース、テーブル。
DELETE DELETE の使用を有効にします。 レベル: グローバル、データベース、テーブル。
DROP データベース、テーブル、およびビューの削除を有効にします。 レベル: グローバル、データベース、テーブル。
DROP ROLE ロールの削除を有効にします。 レベル: グローバル。
EVENT イベントスケジューラでのイベントの使用を有効にします。 レベル: グローバル、データベース。
EXECUTE ユーザーがストアドルーチンを実行できるようにします。 レベル: Global, database, routine.
FILE ユーザーがサーバーにファイルを読み取らせたり書き込ませたりできるようにします。 レベル: グローバル。
GRANT OPTION 権限のほかのアカウントへの付与、またはほかのアカウントからの削除を有効にします。 レベル: Global, database, table, routine, proxy.
INDEX インデックスの作成または削除を有効にします。 レベル: グローバル、データベース、テーブル。
INSERT INSERT の使用を有効にします。 レベル: グローバル、データベース、テーブル、カラム。
LOCK TABLES ユーザーが SELECT 権限を持っているテーブルに対する LOCK TABLES の使用を有効にします。 レベル: グローバル、データベース。
PROCESS ユーザーが SHOW PROCESSLIST を使用してすべてのプロセスを表示できるようにします。 レベル: グローバル。
PROXY ユーザーのプロキシ設定を有効にします。 レベル: ユーザーからユーザーへ。
REFERENCES 外部キーの作成を有効にします。 レベル: グローバル、データベース、テーブル、カラム。
RELOAD FLUSH 操作の使用を有効にします。 レベル: グローバル。
REPLICATION CLIENT ユーザーがソースサーバーまたはレプリカサーバーの場所を尋ねることができるようにします。 レベル: グローバル。
REPLICATION SLAVE レプリカがソースからバイナリログイベントを読み取ることを有効にします。 レベル: グローバル。
SELECT SELECT の使用を有効にします。 レベル: グローバル、データベース、テーブル、カラム。
SHOW DATABASES SHOW DATABASES がすべてのデータベースを表示できるようにします。 レベル: グローバル。
SHOW VIEW SHOW CREATE VIEW の使用を有効にします。 レベル: グローバル、データベース、テーブル。
SHUTDOWN mysqladmin shutdown の使用を有効にします。 レベル: グローバル。
SUPER CHANGE REPLICATION SOURCE TO, CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBALmysqladmin debug コマンドなどの他の管理操作の使用を有効にします。 レベル: グローバル。
TRIGGER トリガー操作を有効にします。 レベル: グローバル、データベース、テーブル。
UPDATE UPDATE の使用を有効にします。 レベル: グローバル、データベース、テーブル、カラム。
USAGE 権限なしのシノニムです

表 13.12 GRANT および REVOKE に許可される動的権限

権限 意味と付与可能なレベル
APPLICATION_PASSWORD_ADMIN デュアルパスワード管理を有効にします。 レベル: グローバル。
AUDIT_ADMIN 監査ログ構成を有効にします。 レベル: グローバル。
BACKUP_ADMIN バックアップ管理を有効にします。 レベル: グローバル。
BINLOG_ADMIN バイナリログ制御を有効にします。 レベル: グローバル。
BINLOG_ENCRYPTION_ADMIN バイナリログ暗号化のアクティブ化および非アクティブ化を有効にします。 レベル: グローバル。
CLONE_ADMIN クローン管理を有効にします。 レベル: グローバル。
CONNECTION_ADMIN 接続制限/制限制御を有効にします。 レベル: グローバル。
ENCRYPTION_KEY_ADMIN InnoDB キーローテーションを有効にします。 レベル: グローバル。
FIREWALL_ADMIN ファイアウォールルール管理 (任意のユーザー) を有効にします。 レベル: グローバル。
FIREWALL_USER ファイアウォールルール管理を有効にします (self )。 レベル: グローバル。
FLUSH_OPTIMIZER_COSTS オプティマイザコストのリロードを有効にします。 レベル: グローバル。
FLUSH_STATUS ステータスインジケータのフラッシュを有効にします。 レベル: グローバル。
FLUSH_TABLES テーブルのフラッシュを有効にします。 レベル: グローバル。
FLUSH_USER_RESOURCES ユーザーリソースのフラッシュを有効にします。 レベル: グローバル。
GROUP_REPLICATION_ADMIN Group Replication 制御を有効にします。 レベル: グローバル。
INNODB_REDO_LOG_ENABLE redo ロギングを有効または無効にします。 レベル: グローバル。
INNODB_REDO_LOG_ARCHIVE redo ログアーカイブ管理を有効にします。 レベル: グローバル。
NDB_STORED_USER SQL ノード間でのユーザーまたは役割の共有を有効にします (NDB Cluster)。 レベル: グローバル。
PERSIST_RO_VARIABLES_ADMIN 読取り専用システム変数の永続化を有効にします。 レベル: グローバル。
REPLICATION_APPLIER レプリケーションチャネルの PRIVILEGE_CHECKS_USER として機能します。 レベル: グローバル。
REPLICATION_SLAVE_ADMIN 通常のレプリケーション制御を有効にします。 レベル: グローバル。
RESOURCE_GROUP_ADMIN リソースグループの管理を有効にします。 レベル: グローバル。
RESOURCE_GROUP_USER リソースグループの管理を有効にします。 レベル: グローバル。
ROLE_ADMIN WITH ADMIN OPTION を使用して、ロールの付与または取消しを可能にします。 レベル: グローバル。
SESSION_VARIABLES_ADMIN 制限付きセッションシステム変数の設定を有効にします。 レベル: グローバル。
SET_USER_ID 非自己 DEFINER 値の設定を有効にします。 レベル: グローバル。
SHOW_ROUTINE ストアドルーチン定義へのアクセスを有効にします。 レベル: グローバル。
SYSTEM_USER アカウントをシステムアカウントとして指定します。 レベル: グローバル。
SYSTEM_VARIABLES_ADMIN グローバルシステム変数の変更または永続化を有効にします。 レベル: グローバル。
TABLE_ENCRYPTION_ADMIN デフォルトの暗号化設定のオーバーライドを有効にします。 レベル: グローバル。
VERSION_TOKEN_ADMIN バージョントークン UDF の使用を有効にします。 レベル: グローバル。
XA_RECOVER_ADMIN XA RECOVER の実行を有効にします。 レベル: グローバル。

トリガーはテーブルに関連付けられます。 トリガーを作成または削除するには、トリガーではなくテーブルに対する TRIGGER 権限が必要です。

GRANT ステートメントでは、ALL [PRIVILEGES] または PROXY 権限は単独で指定する必要があり、ほかの権限とともに指定することはできません。 ALL [PRIVILEGES] は、GRANT OPTION および PROXY 権限を除き、権限が付与されるレベルで使用可能なすべての権限を表します。

MySQL アカウント情報は、mysql システムスキーマのテーブルに格納されます。 詳細は、mysql システムスキーマおよびアクセス制御システムについて詳しく説明している セクション6.2「アクセス制御とアカウント管理」 を参照してください。

付与テーブルに、大文字と小文字が混在したデータベースまたはテーブル名を含む権限行が保持されており、かつ lower_case_table_names システム変数が 0 以外の値に設定されている場合は、REVOKE を使用してこれらの権限を取り消すことはできません。 このような場合は、付与テーブルを直接操作する必要があります。 (lower_case_table_names が設定されている場合、GRANT はこのような行を作成しませんが、その変数を設定する前にこのような行が作成されている可能性があります。 lower_case_table_names 設定は、サーバーの起動時にのみ構成できます。)

権限は、ON 句に使用される構文に応じて、いくつかのレベルで付与できます。 REVOKE の場合、同じ ON 構文で削除する権限を指定します。

グローバル、データベース、テーブル、およびルーチンレベルの場合、GRANT ALL は、付与しようとしているレベルに存在する権限のみを割り当てます。 たとえば、GRANT ALL ON db_name.* はデータベースレベルのステートメントであるため、FILE などのグローバルのみの権限を付与しません。 ALL を付与しても、GRANT OPTION または PROXY 権限は割り当てられません。

object_type 句 (存在する場合) は、それに続くオブジェクトがテーブル、ストアドファンクション、またはストアドプロシージャーであるときは TABLEFUNCTION、または PROCEDURE として指定するようにしてください。

ユーザーがデータベース、テーブル、カラムまたはルーチンに対して保持する権限は、グローバルレベルを含む各権限レベルのアカウント権限の論理 OR として追加的に形成されます。 下位レベルの権限がないため、上位レベルで付与された権限を拒否できません。 たとえば、次のステートメントは SELECT および INSERT 権限をグローバルに付与します:

GRANT SELECT, INSERT ON *.* TO u1;

グローバルに付与された権限は、これらの下位レベルでは付与されませんが、すべてのデータベース、テーブルおよびカラムに適用されます。

MySQL 8.0.16 では、partial_revokes システム変数が有効になっている場合、特定のデータベースに対して権限を取り消すことで、グローバルレベルで付与された権限を明示的に拒否できます:

GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;

前述のステートメントの結果、SELECT はすべてのテーブルにグローバルに適用されますが、INSERT および UPDATEdb1 のテーブルを除くグローバルに適用されます。 db1 へのアカウントアクセスは読取り専用です。

権限確認手順の詳細については、セクション6.2.7「アクセス制御、ステージ 2: リクエストの確認」で説明されています。

1 人のユーザーのテーブル、カラム、またはルーチン権限を使用している場合でも、サーバーはすべてのユーザーのテーブル、カラム、およびルーチン権限を検査するため、これにより MySQL が少し遅くなります。 同様に、いずれかのユーザーのクエリー、更新、または接続の数を制限した場合、サーバーはこれらの値をモニターする必要があります。

MySQL では、存在しないデータベースまたはテーブルに対する権限を付与できます。 テーブルの場合は、付与される権限に CREATE 権限が含まれている必要があります。 この動作は設計によるものであり、データベース管理者がユーザーアカウントと、あとで作成されるデータベースまたはテーブルに対する権限を準備できるようにすることを目的にしています。

重要

MySQL では、データベースまたはテーブルを削除しても、どの権限も自動的には取り消されません。 ただし、ルーチンを削除した場合は、そのルーチンに付与されたルーチンレベルの権限がすべて取り消されます。

グローバル権限

グローバル権限は管理権限です。つまり、特定のサーバー上のすべてのデータベースに適用されます。 グローバル権限を割り当てるには、ON *.* 構文を使用します。

GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';

CREATE TABLESPACE, CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN および SUPER の静的権限は管理権限であり、グローバルにのみ付与できます。

動的権限はすべてグローバルであり、グローバルにのみ付与できます。

その他の権限はグローバルに、またはより具体的なレベルで付与できます。

グローバルレベルで付与される GRANT OPTION の影響は、静的権限と動的権限で異なります:

  • 静的グローバル権限に付与された GRANT OPTION は、すべての静的グローバル権限に適用されます。

  • 動的権限に付与された GRANT OPTION は、その動的権限にのみ適用されます。

グローバルレベルの GRANT ALL では、すべての静的グローバル権限および現在登録されているすべての動的権限が付与されます。 GRANT ステートメントの実行後に登録された動的権限は、どのアカウントにも遡及的に付与されません。

MySQL では、グローバル権限は mysql.user システムテーブルに格納されます。

データベース権限

データベース権限は、特定のデータベース内のすべてのオブジェクトに適用されます。 データベースレベルの権限を割り当てるには、ON db_name.* 構文を使用します。

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';

(ON *.* ではなく) ON * 構文を使用する場合、権限はデフォルトデータベースのデータベースレベルで割り当てられます。 デフォルトデータベースが存在しない場合は、エラーが発生します。

CREATE, DROP, EVENT, GRANT OPTION, LOCK TABLES および REFERENCES 権限は、データベースレベルで指定できます。 また、テーブルまたはルーチン権限もデータベースレベルで指定できます。この場合、これらの権限はデータベース内のすべてのテーブルまたはルーチンに適用されます。

MySQL では、データベース権限は mysql.db システムテーブルに格納されます。

テーブル権限

テーブル権限は、特定のテーブル内のすべてのカラムに適用されます。 テーブルレベルの権限を割り当てるには、ON db_name.tbl_name 構文を使用します。

GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';

db_name.tbl_name ではなく tbl_name を指定した場合、このステートメントは、デフォルトデータベース内の tbl_name に適用されます。 デフォルトデータベースが存在しない場合は、エラーが発生します。

テーブルレベルで許可される priv_type 値は、ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, REFERENCES, SELECT, SHOW VIEW, TRIGGER および UPDATE です。

テーブルレベルの権限は、実テーブルおよびビューに適用されます。 テーブル名が一致していても、CREATE TEMPORARY TABLE で作成されたテーブルには適用されません。 TEMPORARY テーブルの権限の詳細は、セクション13.1.20.2「CREATE TEMPORARY TABLE ステートメント」 を参照してください。

MySQL では、mysql.tables_priv システムテーブルにテーブル権限が格納されます。

カラム権限

カラム権限は、特定のテーブル内の単一カラムに適用されます。 カラムレベルで付与される各権限のあとに、括弧で囲まれた 1 つまたは複数のカラムを指定する必要があります。

GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';

カラムに許可される priv_type 値 (つまり、column_list 句を使用する場合) は、INSERT, REFERENCES, SELECT および UPDATE です。

MySQL では、mysql.columns_priv システムテーブルにカラム権限が格納されます。

ストアドルーチン権限

ALTER ROUTINECREATE ROUTINEEXECUTE、および GRANT OPTION 権限は、ストアドルーチン (プロシージャーおよびファンクション) に適用されます。 これらの権限は、グローバルおよびデータベースレベルで付与できます。 CREATE ROUTINE を除き、これらの権限は、個々のルーチンに対してルーチンレベルで付与できます。

GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';

ルーチンレベルで許可される priv_type 値は、ALTER ROUTINEEXECUTE、および GRANT OPTION です。 ルーチンを最初に作成するには、グローバルレベルまたはデータベースレベルの権限が必要であるため、CREATE ROUTINE はルーチンレベルの権限ではありません。

MySQL では、mysql.procs_priv システムテーブルにルーチンレベルの権限が格納されます。

プロキシユーザー権限

PROXY 権限は、あるユーザーを別のユーザーのプロキシにできるようにします。 プロキシユーザーは、プロキシユーザーのアイデンティティを偽装または取得します。つまり、プロキシユーザーの権限を引き継ぎます。

GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';

PROXY が付与されている場合、GRANT ステートメントで指定されている唯一の権限である必要があり、許可されている WITH オプションは WITH GRANT OPTION のみです。

プロキシ設定では、プロキシユーザーが、接続時にプロキシ設定されたユーザーの名前をサーバーに返すプラグイン経由で認証すること、およびプロキシユーザーがプロキシ設定されたユーザーに対する PROXY 権限を持っていることが必要です。 詳細および例については、セクション6.2.18「プロキシユーザー」を参照してください。

MySQL では、mysql.proxies_priv システムテーブルにプロキシ権限が格納されます。

ロールの付与

ON 句のない GRANT 構文では、個々の権限ではなくロールが付与されます。 ロールは、権限の名前付きコレクションです。セクション6.2.10「ロールの使用」 を参照してください。 例:

GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';

付与する各ロールと、そのロールが付与される各ユーザーアカウントまたはロールが存在する必要があります。 MySQL 8.0.16 では、匿名ユーザーにロールを付与できません。

ロールを付与しても、ロールは自動的にアクティブになりません。 ロールのアクティブ化および非アクティブ化の詳細は、ロールのアクティブ化 を参照してください。

ロールを付与するには、次の権限が必要です:

  • ROLE_ADMIN 権限 (または非推奨の SUPER 権限) を持っている場合は、ユーザーまたはロールに対して任意のロールを付与または取り消すことができます。

  • WITH ADMIN OPTION 句を含む GRANT ステートメントを使用してロールを付与された場合、そのロールを他のユーザーまたはロールに付与したり、他のユーザーまたはロールから取り消すことができます。ただし、後で付与または取消しを行うときにロールがアクティブになっている必要があります。 これには、WITH ADMIN OPTION 自体を使用する機能が含まれます。

  • SYSTEM_USER 権限を持つロールを付与するには、SYSTEM_USER 権限が必要です。

GRANT を使用して循環参照を作成できます。 例:

CREATE USER 'u1', 'u2';
CREATE ROLE 'r1', 'r2';

GRANT 'u1' TO 'u1';   -- simple loop: u1 => u1
GRANT 'r1' TO 'r1';   -- simple loop: r1 => r1

GRANT 'r2' TO 'u2';
GRANT 'u2' TO 'r2';   -- mixed user/role loop: u2 => r2 => u2

循環付与参照は許可されますが、ユーザーまたはロールにはすでに権限およびロールがあるため、権限受領者に新しい権限またはロールは追加されません。

AS 句および権限の制限事項

MySQL 8.0.16 の時点で、GRANT には、ステートメントの実行に使用する権限コンテキストに関する追加情報を指定する AS user [WITH ROLE]句があります。 この構文は SQL レベルで表示できますが、主な目的は、部分的な取消しによって課される権限付与者権限制限のすべてのノード間で均一なレプリケーションを有効にすることです。これにより、これらの制限がバイナリログに表示されます。 部分取消しの詳細は、セクション6.2.12「部分取消しを使用した権限の制限」 を参照してください。

AS user 句が指定されている場合、ステートメントの実行では、WITH ROLE によって指定されたすべてのロール (存在する場合) を含む、指定されたユーザーに関連付けられた権限の制限が考慮されます。 その結果、ステートメントによって実際に付与される権限は、指定された権限と比較して削減される可能性があります。

AS user 句には、次の条件が適用されます:

  • AS は、指定された user に権限制限がある場合にのみ有効です (partial_revokes システム変数が有効になっていることを意味します)。

  • WITH ROLE が指定されている場合は、指定されたすべてのロールを指定された user に付与する必要があります。

  • 名前付き user は、'user_name'@'host_name'CURRENT_USER または CURRENT_USER() として指定された MySQL アカウントである必要があります。 現在のセッション内でアクティブなロールとは異なるロールのセットを適用して GRANT を実行する場合は、現在のユーザーに WITH ROLE との名前を付けることができます。

  • AS を使用して、GRANT ステートメントを実行するユーザーが所有していない権限を取得することはできません。 実行中のユーザーには少なくとも付与される権限が必要ですが、AS 句では付与される権限のみを制限でき、エスカレートはできません。

  • 付与される権限に関して、AS では、GRANT ステートメントを実行するユーザーよりも多くの権限 (制限が少ない) を持つユーザー/ロールの組合せを指定できません。 AS ユーザー/ロールの組合せは、実行中のユーザーよりも多くの権限を持つことが許可されていますが、これらの追加の権限がステートメントで付与されていない場合のみです。

  • AS は、グローバル権限 (ON *.*) の付与でのみサポートされています。

  • AS は、PROXY 権限付与ではサポートされていません。

次の例に、AS 句の影響を示します。 いくつかのグローバル権限およびそれらの権限の制限を持つユーザー u1 を作成します:

CREATE USER u1;
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u1;
REVOKE INSERT, UPDATE ON schema1.* FROM u1;
REVOKE SELECT ON schema2.* FROM u1;

また、権限制限の一部を引き上げてロールを u1 に付与するロール r1 を作成します:

CREATE ROLE r1;
GRANT INSERT ON schema1.* TO r1;
GRANT SELECT ON schema2.* TO r1;
GRANT r1 TO u1;

権限制限のないアカウントを使用して、複数のユーザーに同じグローバル権限のセットを付与しますが、それぞれに AS 句によって課される異なる制限があり、実際に付与されている権限を確認します。

  • ここでの GRANT ステートメントには AS 句がないため、付与される権限は指定したものとまったく同じです:

    mysql> CREATE USER u2;
    mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u2;
    mysql> SHOW GRANTS FOR u2;
    +-------------------------------------------------+
    | Grants for u2@%                                 |
    +-------------------------------------------------+
    | GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` |
    +-------------------------------------------------+
  • ここでの GRANT ステートメントには AS 句があるため、付与される権限は指定された権限ですが、u1 からの制限が適用されます:

    mysql> CREATE USER u3;
    mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u3 AS u1;
    mysql> SHOW GRANTS FOR u3;
    +----------------------------------------------------+
    | Grants for u3@%                                    |
    +----------------------------------------------------+
    | GRANT SELECT, INSERT, UPDATE ON *.* TO `u3`@`%`    |
    | REVOKE INSERT, UPDATE ON `schema1`.* FROM `u3`@`%` |
    | REVOKE SELECT ON `schema2`.* FROM `u3`@`%`         |
    +----------------------------------------------------+

    前述のように、AS 句で追加できるのは権限制限のみで、権限をエスカレートすることはできません。 したがって、u1 には DELETE 権限がありますが、このステートメントでは DELETE の付与が指定されていないため、付与された権限には含まれません。

  • ここで GRANT ステートメントの AS 句を使用すると、u1 に対して r1 ロールがアクティブになります。 そのロールにより、u1 の制限の一部が解除されます。 したがって、付与される権限にはいくつかの制限がありますが、前の GRANT ステートメントと同じ数ではありません:

    mysql> CREATE USER u4;
    mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u4 AS u1 WITH ROLE r1;
    mysql> SHOW GRANTS FOR u4;
    +-------------------------------------------------+
    | Grants for u4@%                                 |
    +-------------------------------------------------+
    | GRANT SELECT, INSERT, UPDATE ON *.* TO `u4`@`%` |
    | REVOKE UPDATE ON `schema1`.* FROM `u4`@`%`      |
    +-------------------------------------------------+

GRANT ステートメントに AS user 句が含まれている場合、そのステートメントを実行するユーザーに対する権限制限は無視されます (AS 句がない場合と同様に適用されません)。

その他のアカウント特性

オプションの WITH 句を使用すると、ユーザーは他のユーザーに権限を付与できます。 WITH GRANT OPTION 句は、ユーザーが、そのユーザーの持つ指定された権限レベルにある任意の権限をほかのユーザーに与えることができるようにします。

他の方法で権限を変更せずに GRANT OPTION 権限をアカウントに付与するには、次の手順を実行します:

GRANT USAGE ON *.* TO 'someuser'@'somehost' WITH GRANT OPTION;

異なる権限を持つ 2 人のユーザーが権限を組み合せることができる可能性があるため、GRANT OPTION 権限を付与するユーザーには注意してください。

自分が保持していない権限を別のユーザーに付与することはできません。GRANT OPTION 権限を使用して割り当てることができるのは、自分が保持している権限だけです。

あるユーザーに特定の権限レベルにある GRANT OPTION 権限を付与すると、そのユーザーがそのレベルに保持している (または、将来与えられる可能性のある) すべての権限も、そのユーザーからほかのユーザーに付与される場合があることに注意してください。 あるユーザーに、データベースに対する INSERT 権限を付与するとします。 次に、そのデータベースに対する SELECT 権限を付与し、WITH GRANT OPTION を指定した場合、そのユーザーはほかのユーザーに SELECT 権限だけでなく、INSERT 権限も与えることができます。 そのあと、そのユーザーにデータベースに対する UPDATE 権限を付与すると、そのユーザーは INSERTSELECT、および UPDATE を付与できます。

非管理ユーザーの場合は、ALTER 権限をグローバルまたは mysql システムスキーマに付与しないでください。 それを行うと、そのユーザーはテーブルの名前を変更することによって権限システムの破壊を試みることができます。

特定の権限に関連付けられたセキュリティーリスクの詳細は、セクション6.2.2「MySQL で提供される権限」を参照してください。

MySQL バージョンと標準 SQL バージョンの GRANT

MySQL バージョンと標準 SQL バージョンの GRANT の最大の違いは次のとおりです。

  • MySQL は、権限をユーザー名だけではなく、ホスト名とユーザー名の組み合わせに関連付けます。

  • 標準 SQL はグローバルまたはデータベースレベルの権限を持たず、また MySQL がサポートするすべての権限タイプをサポートしているわけでもありません。

  • MySQL は、標準 SQL の UNDER 権限をサポートしていません。

  • 標準 SQL の権限は、階層的な方法で構造化されています。 ユーザーを削除した場合は、そのユーザーに付与されていたすべての権限が取り消されます。 これはまた、DROP USER を使用した場合の MySQL にも当てはまります。 セクション13.7.1.5「DROP USER ステートメント」を参照してください。

  • 標準 SQL では、テーブルを削除すると、そのテーブルに対するすべての権限が取り消されます。 標準 SQL では、権限を取り消すと、その権限に基づいて付与されていたすべての権限も取り消されます。 MySQL では、DROP USER ステートメントまたは REVOKE ステートメントを使用して権限を削除できます。

  • MySQL では、テーブル内の一部のカラムに対してのみ INSERT 権限を持つことができます。 この場合、INSERT 権限を持っているカラムの値のみを挿入するのであれば、そのテーブルに対して引き続き INSERT ステートメントを実行できます。 厳密な SQL モードが有効になっていない場合、省略されたカラムはその暗黙のデフォルト値に設定されます。 厳密モードでは、省略されたカラムのいずれかにデフォルト値がない場合、このステートメントは拒否されます。 (標準 SQL では、すべてのカラムに対する INSERT 権限が必要です。) 厳密な SQL モードおよび暗黙的なデフォルト値の詳細は、セクション5.1.11「サーバー SQL モード」 および セクション11.6「データ型デフォルト値」 を参照してください。


関連キーワード:  ステートメント, 権限, GRANT, レベル, 付与, グローバル, ユーザー, テーブル, データベース, CREATE