SQLのREVOKEコマンド完全ガイド|データベース権限の取り消し方法を徹底解説

プログラミング・IT

データベースを複数人で使う場合、「誰が」「何を」「どこまで」できるかを管理する必要があります。

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オプションがなく、依存する権限は自動的に取り消されます。

セキュリティのベストプラクティス

権限管理で守るべき原則を紹介します。

最小権限の原則を守る

必要最低限の権限だけを与え、不要になったらすぐに取り消しましょう。

「念のため」という理由で権限を残しておくのは危険です。

定期的な権限の見直し

少なくとも半年に一度は、全ユーザーの権限を見直すことをおすすめします。

-- 定期的にすべてのユーザーの権限を確認
-- (データベースシステムに応じたコマンドを実行)

ロールベースの管理

個別のユーザーに直接権限を与えるのではなく、ロールを作成して管理しましょう。

良い例

  1. 「営業閲覧」「営業編集」などのロールを作成
  2. ロールに必要な権限を付与
  3. ユーザーをロールに所属させる
  4. 権限変更が必要なときはロールから削除

悪い例
各ユーザーに個別に権限を付与
→ 管理が複雑になり、漏れが発生しやすい

記録を残す

誰が、いつ、どの権限を取り消したかを記録しておきましょう。

多くのデータベースシステムには監査ログ機能がありますので、活用することをおすすめします。

まとめ

SQLのREVOKEコマンドについて解説してきました。

REVOKEコマンドの要点

  • データベースユーザーの権限を取り消すコマンド
  • GRANTコマンドの反対の働きをする
  • セキュリティ管理に不可欠な機能

基本的な構文

REVOKE 権限名
ON オブジェクト名
FROM ユーザー名;

主な使用場面

  • 社員の退職や異動
  • プロジェクトの終了
  • セキュリティ違反への対応
  • 定期的な権限の見直し

重要なポイント

  • 実行前に現在の権限を必ず確認する
  • CASCADEとRESTRICTを適切に使い分ける
  • 所有者の権限は取り消せない
  • トランザクションでロールバックできない場合がある
  • データベースシステムによって構文が少し異なる

セキュリティのベストプラクティス

  • 最小権限の原則を守る
  • ロールベースで管理する
  • 定期的に権限を見直す
  • 変更の記録を残す

REVOKEコマンドは、データベースのセキュリティを守るための重要なツールです。

適切に使いこなすことで、不正アクセスや誤操作からデータを守り、法令遵守にも貢献できます。

最初は複雑に感じるかもしれませんが、基本的な使い方をマスターすれば、安全なデータベース管理ができるようになります。実際の環境で試す場合は、テスト環境で十分に練習してから、本番環境に適用するようにしましょう。

権限管理は「与える」ことと同じくらい「取り消す」ことも大切です。REVOKEコマンドを正しく理解して、セキュアなデータベース運用を心がけてくださいね。

コメント

タイトルとURLをコピーしました