データベースを複数人で使う場合、「誰が」「何を」「どこまで」できるかを管理する必要があります。
SQLのREVOKEコマンドは、ユーザーやロールに与えた権限を取り消すためのコマンドです。セキュリティを守るために、とても重要な役割を果たしています。
今回は、REVOKEコマンドの基本から実践的な使い方まで、初心者の方にもわかりやすく解説していきます。データベース管理を学んでいる方や、これから学ぼうとしている方は、ぜひ参考にしてください。
REVOKEコマンドとは?

REVOKEコマンドとは、データベースのユーザーやロールに対して、以前に与えた権限を取り消すためのSQLコマンドです。
簡単に言えば、「この人には、もうこの作業をさせない」という設定をするコマンドなんです。
権限とは?
まず、「権限」について理解しましょう。
データベースでは、次のような操作それぞれに権限が必要です。
主な権限の種類:
- SELECT: データを読み取る権限
- INSERT: 新しいデータを追加する権限
- UPDATE: 既存のデータを変更する権限
- DELETE: データを削除する権限
- CREATE: テーブルなどを作成する権限
- DROP: テーブルなどを削除する権限
- ALTER: テーブルの構造を変更する権限
- EXECUTE: ストアドプロシージャなどを実行する権限
これらの権限を適切に管理することで、データベースのセキュリティを保つことができるんです。
GRANTとREVOKEの関係
REVOKEコマンドは、GRANTコマンドの反対の働きをします。
GRANT: 権限を与える(許可する)
REVOKE: 権限を取り消す(撤回する)
例えば、社員Aさんに顧客データの閲覧権限を与えたけれど、部署異動で必要なくなった場合、REVOKEコマンドでその権限を取り消すわけです。
REVOKEが必要な理由
なぜ権限を取り消す必要があるのでしょうか?
セキュリティの強化
最小権限の原則という考え方があります。
これは「ユーザーには、業務に必要最低限の権限だけを与える」という原則です。必要のない権限を持っていると、誤操作や悪意のある操作によって、重要なデータが危険にさらされる可能性があるからです。
役割の変更への対応
社員の異動や退職、プロジェクトの終了など、役割が変わったときに、不要になった権限を取り消す必要があります。
例えば、経理部から営業部に異動した社員に、経理データへのアクセス権限を残しておくのは危険ですよね。
コンプライアンスの遵守
個人情報保護法やGDPRなどの法規制では、アクセス権限の適切な管理が求められています。
定期的に権限を見直して、不要なものを取り消すことは、法令遵守の観点からも重要です。
REVOKEコマンドの基本構文
REVOKEコマンドの基本的な形は、以下のようになります。
REVOKE 権限名
ON オブジェクト名
FROM ユーザー名;
それぞれの要素を見ていきましょう。
権限名: 取り消す権限の種類(SELECT、INSERT、UPDATEなど)
オブジェクト名: 対象となるテーブルやデータベースの名前
ユーザー名: 権限を取り消す対象のユーザーまたはロールの名前
基本的な使用例
例1: SELECT権限を取り消す
REVOKE SELECT
ON customers
FROM user_tanaka;
これは、「user_tanaka」というユーザーから、「customers」テーブルのデータを読み取る権限を取り消しています。
例2: 複数の権限を一度に取り消す
REVOKE SELECT, INSERT, UPDATE
ON orders
FROM user_suzuki;
カンマで区切ることで、複数の権限を一度に取り消せます。
主要なデータベースシステムでの使い方
REVOKEコマンドは、ほとんどのデータベースシステムで使えますが、細かい書き方が少しずつ違います。
SQL Serverの場合
SQL Serverでは、次のような形で使います。
基本的な例:
-- データベースを選択
USE master;
-- SELECT権限を取り消す
REVOKE SELECT
ON dbo.employees
FROM user_yamada;
GO
GRANT OPTIONの取り消し:
-- 他のユーザーに権限を与える権利だけを取り消す
REVOKE GRANT OPTION FOR SELECT
ON dbo.employees
FROM user_yamada;
GO
GRANT OPTIONとは、「他の人にも同じ権限を与えられる権利」のこと。これだけを取り消すこともできます。
すべての権限を取り消す:
-- すべての権限を一度に取り消す
REVOKE ALL PRIVILEGES
ON dbo.employees
FROM user_yamada;
GO
PostgreSQLの場合
PostgreSQLでは、少し表現が違います。
基本的な例:
-- SELECT権限を取り消す
REVOKE SELECT
ON employees
FROM user_tanaka;
カラム単位で権限を取り消す:
-- 特定のカラムに対する権限を取り消す
REVOKE SELECT (salary, bonus)
ON employees
FROM user_suzuki;
給料や賞与などの機密情報だけアクセスできないようにする、といった使い方ができます。
スキーマ全体から権限を取り消す:
-- スキーマ内のすべてのテーブルから権限を取り消す
REVOKE SELECT
ON ALL TABLES IN SCHEMA public
FROM user_yamada;
MySQLの場合
MySQLでは、ユーザー名にホスト名も含める必要があります。
基本的な例:
-- SELECT権限を取り消す
REVOKE SELECT
ON database_name.table_name
FROM 'username'@'localhost';
'username'@'localhost'の形式で、どのホストからのアクセスに対する権限かを指定します。
すべての権限を取り消す:
-- すべてのデータベースに対するすべての権限を取り消す
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM 'username'@'localhost';
変更を反映させる:
-- 権限の変更を即座に反映
FLUSH PRIVILEGES;
MySQLでは、権限を変更した後にFLUSH PRIVILEGESを実行することが推奨されています。
実践的な使用例

実際の業務でよくあるシーンを想定した例を見ていきましょう。
ケース1: 退職者の権限をすべて取り消す
社員が退職した場合、すべての権限を取り消します。
SQL Server:
USE CompanyDB;
-- すべての権限を取り消す
REVOKE ALL PRIVILEGES
ON dbo.customers
FROM retired_employee;
REVOKE ALL PRIVILEGES
ON dbo.orders
FROM retired_employee;
GO
PostgreSQL:
-- データベース全体の接続権限を取り消す
REVOKE CONNECT
ON DATABASE company_db
FROM retired_employee;
-- すべてのテーブルへのアクセス権を取り消す
REVOKE ALL PRIVILEGES
ON ALL TABLES IN SCHEMA public
FROM retired_employee;
ケース2: 部署異動による権限の変更
営業部から総務部に異動した場合、営業データへのアクセス権を取り消します。
-- 営業データベースへのアクセス権を取り消す
REVOKE SELECT, INSERT, UPDATE
ON sales.customer_data
FROM user_tanaka;
REVOKE SELECT
ON sales.revenue_report
FROM user_tanaka;
その後、総務部で必要な権限をGRANTで新たに付与します。
ケース3: プロジェクト終了による一時的な権限の取り消し
プロジェクトが終了したら、プロジェクトメンバーの特別な権限を取り消します。
-- プロジェクトデータベースへの書き込み権限を取り消す
REVOKE INSERT, UPDATE, DELETE
ON project_alpha.tasks
FROM project_member1, project_member2, project_member3;
-- 読み取り権限は残す(SELECT権限は取り消さない)
ケース4: セキュリティ違反への対応
不正アクセスが疑われる場合、すぐに該当ユーザーの権限を取り消します。
-- すべての権限を緊急で取り消す
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM suspicious_user;
-- データベースへの接続自体を禁止
REVOKE CONNECT
ON DATABASE company_db
FROM suspicious_user;
CASCADE と RESTRICTオプション
REVOKEコマンドには、権限の連鎖的な取り消しを制御するオプションがあります。
CASCADEオプション
CASCADEを指定すると、取り消す権限に依存している他の権限も一緒に取り消されます。
REVOKE SELECT
ON employees
FROM user_a
CASCADE;
どんなときに使う?
例えば、user_aがuser_bにSELECT権限を与えていた場合、user_aの権限を取り消すと、user_bの権限も一緒に取り消されます。
これは「権限の連鎖を断ち切る」イメージです。
RESTRICTオプション
RESTRICTを指定すると、依存している権限がある場合はエラーになり、取り消しが実行されません。
REVOKE SELECT
ON employees
FROM user_a
RESTRICT;
どんなときに使う?
「この人の権限を取り消すと、他の人に影響が出るかもしれない」という確認をしたいときに使います。
安全に権限を管理したい場合は、RESTRICTを使って慎重に進めることをおすすめします。
GRANT OPTIONの取り消し
少し複雑ですが、重要な概念があります。
GRANT OPTIONとは?
権限には、「自分が使える権利」と「他の人にも与えられる権利」の2つがあります。
通常の権限: 自分がその操作を行える
GRANT OPTION: 他の人にも同じ権限を与えられる
GRANT OPTIONだけを取り消す
他人に権限を与える権利だけを取り消して、自分で使う権利は残すことができます。
-- SQL Server
REVOKE GRANT OPTION FOR SELECT
ON employees
FROM user_tanaka;
GO
これで、user_tanakaは引き続きemployeesテーブルを読めますが、他の人にSELECT権限を与えることはできなくなります。
REVOKEコマンドの注意点
REVOKEコマンドを使うときに気をつけるべきポイントがあります。
即座に反映される
REVOKEコマンドは、実行するとすぐに反映されます。
データベースシステムによっては、現在接続中のユーザーにも即座に影響します。誤って重要な権限を取り消すと、業務が止まってしまう可能性があるので注意が必要です。
トランザクションでロールバックできない場合がある
MySQLなど一部のデータベースでは、REVOKEコマンドはトランザクションの対象外です。
つまり、「やっぱり取り消し」ができない場合があります。実行前に十分確認しましょう。
所有者の権限は取り消せない
テーブルやデータベースの所有者(作成者)は、そのオブジェクトに対してすべての権限を持っています。
所有者の権限は取り消せません。どうしても必要な場合は、所有者を変更する必要があります。
権限の確認方法
権限を取り消す前に、現在の権限を確認しておきましょう。
SQL Server:
-- 特定のユーザーの権限を確認
EXEC sp_helprotect @username = 'user_tanaka';
PostgreSQL:
-- テーブルの権限を確認
\dp table_name
-- またはSQLで確認
SELECT * FROM information_schema.table_privileges
WHERE grantee = 'user_tanaka';
MySQL:
-- ユーザーの権限を確認
SHOW GRANTS FOR 'username'@'localhost';
複数のユーザーから一度に取り消す
効率的に権限を管理するため、複数のユーザーを指定できます。
-- 複数のユーザーから同時に権限を取り消す
REVOKE SELECT
ON employees
FROM user_a, user_b, user_c;
ロールを使った権限管理

個別のユーザーではなく、「ロール」を使うと権限管理が楽になります。
ロールとは?
ロールとは、権限の集合体です。グループのようなものと考えてください。
例えば、「営業部ロール」「経理部ロール」のように、部署や役割ごとにロールを作成します。
ロールから権限を取り消す
-- ロールからSELECT権限を取り消す
REVOKE SELECT
ON customers
FROM sales_role;
ロールに所属するすべてのユーザーから、一度に権限を取り消せるので便利です。
ユーザーからロールを取り消す
-- ユーザーからロールを剥奪
REVOKE sales_role
FROM user_tanaka;
これで、user_tanakaはsales_roleが持っていたすべての権限を失います。
よくあるトラブルと解決方法
REVOKEコマンドを使っていて、よくある問題と対処法を紹介します。
権限が取り消せない
症状: REVOKEを実行してもエラーになる
原因と解決方法:
原因1: 実行しているユーザーに権限がない
→ 管理者権限(GRANT OPTION)を持つユーザーで実行する
原因2: すでに取り消されている
→ 現在の権限を確認する(SHOW GRANTSなど)
原因3: 所有者の権限を取り消そうとしている
→ 所有者の権限は取り消せません
権限を取り消したのに使える
症状: REVOKEを実行したのに、ユーザーがまだ操作できる
原因と解決方法:
原因1: 別のロールを通じて権限を持っている
→ すべてのロールとグループの権限を確認する
原因2: PUBLICロールに権限がある
→ PUBLICからも権限を取り消す必要がある
-- PUBLICからも取り消す
REVOKE SELECT
ON employees
FROM PUBLIC;
原因3: MySQLでFLUSH PRIVILEGESを実行していない
→ FLUSH PRIVILEGESを実行する
CASCADE指定でエラーが出る
症状: CASCADEオプションを指定するとエラーになる
原因と解決方法:
データベースシステムによっては、CASCADEの書き方が違います。
PostgreSQL:
REVOKE SELECT ON employees FROM user_a CASCADE;
SQL Server:
SQL ServerにはCASCADEオプションがなく、依存する権限は自動的に取り消されます。
セキュリティのベストプラクティス
権限管理で守るべき原則を紹介します。
最小権限の原則を守る
必要最低限の権限だけを与え、不要になったらすぐに取り消しましょう。
「念のため」という理由で権限を残しておくのは危険です。
定期的な権限の見直し
少なくとも半年に一度は、全ユーザーの権限を見直すことをおすすめします。
-- 定期的にすべてのユーザーの権限を確認
-- (データベースシステムに応じたコマンドを実行)
ロールベースの管理
個別のユーザーに直接権限を与えるのではなく、ロールを作成して管理しましょう。
良い例:
- 「営業閲覧」「営業編集」などのロールを作成
- ロールに必要な権限を付与
- ユーザーをロールに所属させる
- 権限変更が必要なときはロールから削除
悪い例:
各ユーザーに個別に権限を付与
→ 管理が複雑になり、漏れが発生しやすい
記録を残す
誰が、いつ、どの権限を取り消したかを記録しておきましょう。
多くのデータベースシステムには監査ログ機能がありますので、活用することをおすすめします。
まとめ
SQLのREVOKEコマンドについて解説してきました。
REVOKEコマンドの要点:
- データベースユーザーの権限を取り消すコマンド
- GRANTコマンドの反対の働きをする
- セキュリティ管理に不可欠な機能
基本的な構文:
REVOKE 権限名
ON オブジェクト名
FROM ユーザー名;
主な使用場面:
- 社員の退職や異動
- プロジェクトの終了
- セキュリティ違反への対応
- 定期的な権限の見直し
重要なポイント:
- 実行前に現在の権限を必ず確認する
- CASCADEとRESTRICTを適切に使い分ける
- 所有者の権限は取り消せない
- トランザクションでロールバックできない場合がある
- データベースシステムによって構文が少し異なる
セキュリティのベストプラクティス:
- 最小権限の原則を守る
- ロールベースで管理する
- 定期的に権限を見直す
- 変更の記録を残す
REVOKEコマンドは、データベースのセキュリティを守るための重要なツールです。
適切に使いこなすことで、不正アクセスや誤操作からデータを守り、法令遵守にも貢献できます。
最初は複雑に感じるかもしれませんが、基本的な使い方をマスターすれば、安全なデータベース管理ができるようになります。実際の環境で試す場合は、テスト環境で十分に練習してから、本番環境に適用するようにしましょう。
権限管理は「与える」ことと同じくらい「取り消す」ことも大切です。REVOKEコマンドを正しく理解して、セキュアなデータベース運用を心がけてくださいね。

コメント