言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. GRANT / REVOKE

GRANT / REVOKE

対応: SQL-92(1992)

データベースユーザーへの権限付与(GRANT)や権限の剥奪(REVOKE)を行う命令です。セキュリティ管理に使用します。

構文

ユーザーに権限を付与します。

GRANT 権限 ON データベース名.テーブル名 TO 'ユーザー名'@'ホスト名';

付与した権限を他のユーザーへ委任できる権限を付与します。

GRANT 権限 ON データベース名.テーブル名 TO 'ユーザー名'@'ホスト名' WITH GRANT OPTION;

ユーザーから権限を剥奪します。

REVOKE 権限 ON データベース名.テーブル名 FROM 'ユーザー名'@'ホスト名';

ユーザーの権限を確認します(MySQL)。

SHOW GRANTS FOR 'ユーザー名'@'ホスト名';

権限一覧

権限概要
SELECTデータの参照を許可します。
INSERTデータの挿入を許可します。
UPDATEデータの更新を許可します。
DELETEデータの削除を許可します。
CREATEテーブル・データベースの作成を許可します。
DROPテーブル・データベースの削除を許可します。
ALTERテーブル定義の変更を許可します。
INDEXインデックスの作成・削除を許可します。
ALL PRIVILEGESすべての権限を付与します。管理者ユーザーに使用します。
WITH GRANT OPTION受け取った権限を他のユーザーに付与する権限も与えます。

サンプルコード

以下の3つのユーザーを例に説明します。データベース名は『shop_db』とします。

users username host purpose app_user localhost application report_user % (all hosts) report access public_user % (all hosts) public page 3 users

アプリケーション用ユーザーに SELECT・INSERT・UPDATE・DELETE を許可します。

sample_grant_revoke.sql
GRANT SELECT, INSERT, UPDATE, DELETE
    ON shop_db.*
    TO 'app_user'@'localhost';
Query OK, 0 rows affected

読み取り専用のレポートユーザーを作成します。

sample_grant_revoke.sql
GRANT SELECT
    ON shop_db.*
    TO 'report_user'@'%';
Query OK, 0 rows affected

特定テーブルのみアクセスを許可します。

sample_grant_revoke.sql
GRANT SELECT
    ON shop_db.products
    TO 'public_user'@'%';
Query OK, 0 rows affected

管理者ユーザーにすべての権限を付与します。

sample_grant_revoke.sql
GRANT ALL PRIVILEGES
    ON shop_db.*
    TO 'admin_user'@'localhost'
    WITH GRANT OPTION;
Query OK, 0 rows affected

レポートユーザーから SELECT 権限を剥奪します。

sample_grant_revoke.sql
REVOKE SELECT
    ON shop_db.*
    FROM 'report_user'@'%';
Query OK, 0 rows affected

ユーザーの権限を確認します(MySQL)。

sample_grant_revoke.sql
SHOW GRANTS FOR 'app_user'@'localhost';
+-------------------------------------------------------------------------------+
| Grants for app_user@localhost                                                 |
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                                  |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `shop_db`.* TO `app_user`@`localhost` |
+-------------------------------------------------------------------------------+
2 rows in set

権限変更を即時反映します(MySQL)。『GRANT』文を直接実行した場合はこのコマンドは不要ですが、権限テーブルを手動で編集した場合に変更を反映させるために使用します。

sample_grant_revoke.sql
FLUSH PRIVILEGES;
Query OK, 0 rows affected

データベース別の書き方

MySQL は『GRANT』『REVOKE』を使用します。ユーザーは「ユーザー名@ホスト名」の形式で指定します。

GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'app_user'@'localhost';
REVOKE SELECT ON shop_db.* FROM 'report_user'@'%';
SHOW GRANTS FOR 'app_user'@'localhost';

PostgreSQL は MySQL と似た構文ですが、ユーザー指定に『@ホスト名』は使用しません。ロール(役割)ベースの権限管理に対応しています。

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

-- ユーザーの権限を確認します(PostgreSQL)。
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'app_user';

SQLite はファイルベースのデータベースのため、『GRANT』『REVOKE』コマンドはありません。アクセス制御はファイルシステムの権限で管理します。

概要

『GRANT』と『REVOKE』はDCL(データ制御言語)に分類されます。本番環境では最小権限の原則(Principle of Least Privilege)に従い、アプリケーションに必要な権限だけを付与することが重要です。例えば参照のみを行うAPIユーザーにはSELECTだけ、データ書き込みを行うユーザーにはSELECT・INSERT・UPDATE・DELETEのみを付与します。

MySQLでは「ユーザー名@ホスト名」の形式でユーザーを識別します。『%』はすべてのホストを意味し、『localhost』はローカル接続のみを意味します。セキュリティの観点から、外部公開するユーザーには必要最小限の権限を設定してください。

トランザクション制御については『TRANSACTION / COMMIT / ROLLBACK』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。