データってまるでお城みたいなもので、住人それぞれに権限があるんだ。誰かは中庭を歩くだけ、誰かは宝物庫の鍵を持ってるし、誰かは玉座の間で全体を管理してる。データベースでは、この役割をGRANTとREVOKEコマンドが担ってる。つまり「誰がどこに何のために行けるか」を決めるやつだね。
GRANTコマンドは、普通のgrant(助成金)みたいに、特定のロールにリソース(例えばデータベース、テーブル、スキーマなど)へのアクセスを与えるもの。いわば「パーティーへの招待状」みたいなもので、誰が読む・書く・家具を壊す(?)かを決める感じ。
REVOKEコマンドは逆に、前に与えた権限を取り上げるやつ。「おい、パーティーは君には終わりだよ、鍵は出口に置いてって」みたいな感じ。
GRANTで権限を与える
まずは一番上のレベル、データベースから始めよう。ユーザーがデータベースに接続できるようにするには、接続権限を与える必要がある。そのためにはこのコマンドを使う:
GRANT CONNECT ON DATABASE database_name TO role_name;
例えば、universityというデータベースとstudentというロールがあるとする。学生たちに接続を許可するには、次のクエリを実行する:
GRANT CONNECT ON DATABASE university TO student;
でも、接続できるだけじゃ何でもできるわけじゃない。ユーザーがデータベース内でオブジェクトを作れるようにするには、さらにCREATE権限が必要:
GRANT CREATE ON DATABASE university TO student;
データベースの権限はこのコマンドで確認できるよ:
\l+ university
REVOKEで権限を取り消す
もし学生が怪しい動きをし始めたら(例えば、想定以上にテーブルを作ろうとしたり)、CREATE権限を取り消すことができる:
REVOKE CREATE ON DATABASE university FROM student;
これで学生は接続だけできて、もう「クリエイティブな暴走」はできなくなる。
スキーマレベルでの権限設定
スキーマは、データベースの中の「部屋」みたいなもので、テーブルやビュー、他のオブジェクトが入ってる。ユーザーがスキーマ内のオブジェクトを扱うには、読み取り・書き込み・作成の権限を設定できる。
スキーマへの権限付与
例えば、publicスキーマ(これはどのデータベースにもデフォルトであるやつ)があるとする。ユーザーにスキーマの中身を見せたい場合:
GRANT USAGE ON SCHEMA public TO student;
でもUSAGEだけじゃテーブル操作はできない。新しいオブジェクトを作れるようにするには:
GRANT CREATE ON SCHEMA public TO student;
これで学生はpublicスキーマ内でテーブルを読んだり作ったりできるようになる。
スキーマ権限の取り消し
もし学生がbad_idea_01みたいな変なテーブルを作り始めたら、権限を制限できる:
REVOKE CREATE ON SCHEMA public FROM student;
これで新しいテーブルは追加できなくなる。秩序復活!
テーブルレベルでの権限設定
テーブルはたぶんデータベースで一番人気のオブジェクト。テーブルへのアクセスをどう設定するか見てみよう。主に3つのアクションがある:読み取り、書き込み、変更。
読み取り権限
ユーザーにテーブルの中身を読ませたい場合はこのコマンド:
GRANT SELECT ON TABLE table_name TO role_name;
例えば、学生たちにcoursesテーブルのレコードを読ませたい場合:
GRANT SELECT ON TABLE courses TO student;
これでstudentユーザーはcoursesテーブルでSELECTクエリを実行できる。
書き込み権限
ユーザーにテーブルへ新しい行を追加させたい場合はこうする:
GRANT INSERT ON TABLE table_name TO role_name;
例:
GRANT INSERT ON TABLE courses TO student;
これで学生は新しいコースをテーブルに追加できる。でもちょっと待って…本当にそれでいいのかな?
変更・削除権限
ユーザーが既存の行を更新したり削除したりできるようにするには、UPDATEとDELETE権限を与える必要がある。
GRANT UPDATE ON TABLE courses TO student;
GRANT DELETE ON TABLE courses TO student;
アドバイス:この権限は乱用しないようにしよう。学生に削除権限を与えると、うっかり(あるいはわざと)全部消しちゃうかも。
例:制限付き権限のロールを作る
例えば、先生用のロールを作りたいとする。先生は学生やコースのデータを読めるけど、削除はできないようにしたい。こうやってやる:
- ロールを作成:
CREATE ROLE teacher;
studentsとcoursesテーブルの読み取り権限を与える:
GRANT SELECT ON TABLE students, courses TO teacher;
- 削除権限を制限:
REVOKE DELETE ON TABLE students, courses FROM teacher;
これで先生たちは必要な権限だけ持って、余計なことはできなくなる。
GRANTとREVOKEを組み合わせて柔軟に設定する方法
例えば、internというロールがあって、これを制限したいとする。コースのデータだけアクセスできて、学生のデータには絶対アクセスさせたくない。こうやる:
coursesテーブルだけアクセス許可:
GRANT SELECT, INSERT ON TABLE courses TO intern;
internロールがstudentsテーブルに権限を持っていないことを確認:
REVOKE ALL ON TABLE students FROM intern;
この組み合わせで、アクセス権限をピンポイントで調整できる。
実際のプロジェクトでの利用例
このアクセス管理の仕組みは、実際のプロジェクトでもよく使われてる。例えば:
- ネットショップでは、ユーザーテーブルや注文テーブルの権限が「admin」「operator」「guest」などのロールごとに分かれてる。
- 大学システムでは、管理者はコースを追加・編集できて、学生は閲覧だけ。
- 銀行システムでは、顧客アカウントへのアクセスが部署ごとに分けられてる。
GO TO FULL VERSION