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
ステートメントでは、権限またはロールのいずれかを付与する必要があります。-
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;
正常に実行されると、GRANT
は mysql プログラムから 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 サーバーへの接続を許可する場合は、'
としてすべてのローカルユーザーにも権限を付与する必要があります。 それ以外の場合は、指定されたユーザーがローカルマシンから MySQL サーバーにログインしようとすると、user_name
'@'localhost'mysql.user
システムテーブルの localhost
の匿名ユーザーアカウントが使用されます。 詳細は、セクション6.2.6「アクセス制御、ステージ 1: 接続の検証」を参照してください。
この問題が適用されるかどうかを判断するには、匿名ユーザーをリストする次のクエリーを実行します:
SELECT Host, User FROM mysql.user WHERE User='';
今説明した問題を回避するには、次のステートメントを使用して、ローカルの匿名ユーザーアカウントを削除します。
DROP USER ''@'localhost';
次のテーブルに、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 USER 、DROP USER 、RENAME 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 GLOBAL や mysqladmin 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
句 (存在する場合) は、それに続くオブジェクトがテーブル、ストアドファンクション、またはストアドプロシージャーであるときは TABLE
、FUNCTION
、または 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
および UPDATE
は db1
のテーブルを除くグローバルに適用されます。 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 ROUTINE
、CREATE ROUTINE
、EXECUTE
、および GRANT OPTION
権限は、ストアドルーチン (プロシージャーおよびファンクション) に適用されます。 これらの権限は、グローバルおよびデータベースレベルで付与できます。 CREATE ROUTINE
を除き、これらの権限は、個々のルーチンに対してルーチンレベルで付与できます。
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
ルーチンレベルで許可される priv_type
値は、ALTER ROUTINE
、EXECUTE
、および 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
循環付与参照は許可されますが、ユーザーまたはロールにはすでに権限およびロールがあるため、権限受領者に新しい権限またはロールは追加されません。
MySQL 8.0.16 の時点で、GRANT
には、ステートメントの実行に使用する権限コンテキストに関する追加情報を指定する AS
句があります。 この構文は SQL レベルで表示できますが、主な目的は、部分的な取消しによって課される権限付与者権限制限のすべてのノード間で均一なレプリケーションを有効にすることです。これにより、これらの制限がバイナリログに表示されます。 部分取消しの詳細は、セクション6.2.12「部分取消しを使用した権限の制限」 を参照してください。
user
[WITH ROLE]
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
権限を付与すると、そのユーザーは INSERT
、SELECT
、および UPDATE
を付与できます。
非管理ユーザーの場合は、ALTER
権限をグローバルまたは mysql
システムスキーマに付与しないでください。 それを行うと、そのユーザーはテーブルの名前を変更することによって権限システムの破壊を試みることができます。
特定の権限に関連付けられたセキュリティーリスクの詳細は、セクション6.2.2「MySQL で提供される権限」を参照してください。
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「データ型デフォルト値」 を参照してください。