Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

GRANT / REVOKE

データベースユーザーへの権限付与(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受け取った権限を他のユーザーに付与する権限も与えます。
サンプルコード
-- アプリケーション用ユーザーに SELECT・INSERT・UPDATE・DELETE を許可します。
GRANT SELECT, INSERT, UPDATE, DELETE
    ON shop_db.*
    TO 'app_user'@'localhost';

-- 読み取り専用のレポートユーザーを作成します。
GRANT SELECT
    ON shop_db.*
    TO 'report_user'@'%';

-- 特定テーブルのみアクセスを許可します。
GRANT SELECT
    ON shop_db.products
    TO 'public_user'@'%';

-- 管理者ユーザーにすべての権限を付与します。
GRANT ALL PRIVILEGES
    ON shop_db.*
    TO 'admin_user'@'localhost'
    WITH GRANT OPTION;

-- レポートユーザーから SELECT 権限を剥奪します。
REVOKE SELECT
    ON shop_db.*
    FROM 'report_user'@'%';

-- ユーザーの権限を確認します(MySQL)。
SHOW GRANTS FOR 'app_user'@'localhost';

-- 権限変更を即時反映します(MySQL)。
FLUSH PRIVILEGES;
実行結果
-- 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` |
-- +-------------------------------------------------------------------------+
データベース別の書き方

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

-- ユーザーに権限を付与します(PostgreSQL)。
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';

Oracle はユーザーとスキーマが一対一で対応しており、権限付与にはシステム権限とオブジェクト権限の2種類があります。

-- オブジェクト権限を付与します(Oracle)。
GRANT SELECT, INSERT ON shop_db.products TO app_user;

-- システム権限を付与します(Oracle)。
GRANT CREATE SESSION, CREATE TABLE TO app_user;

-- ユーザーの権限を確認します(Oracle)。
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'APP_USER';

SQL Server はスキーマ単位の権限管理に加え、ロール(db_datareader・db_datawriter など)による権限管理が一般的です。

-- テーブルに対する権限を付与します(SQL Server)。
GRANT SELECT, INSERT, UPDATE, DELETE ON dbo.products TO app_user;

-- 組み込みロールにユーザーを追加します(SQL Server)。
ALTER ROLE db_datareader ADD MEMBER report_user;

-- ユーザーの権限を確認します(SQL Server)。
EXEC sp_helpuser 'app_user';

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

概要

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

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

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

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