導入
会社のデータベースを、全社員が自由に消したり書き換えたりできたら大惨事です。「経理は売上テーブルを読める」「アプリ用のアカウントは注文の追加だけできる」――こうしたアクセス制御を担うのが DCL の GRANT と REVOKE です。
説明
まず DB には「ユーザー(ロール)」という概念があります。人やアプリごとにアカウントを作り、それぞれに権限を割り当てます。
GRANT ― 権限を付与する。「誰に・どのテーブルに・何を許すか」を指定します。
-- app_user に products テーブルの参照と追加を許可
GRANT SELECT, INSERT ON products TO app_user;
-- 全部の操作を許可(読み・書き・変更・削除)
GRANT ALL PRIVILEGES ON orders TO admin_user;
REVOKE ― 権限を取り上げる。付与した権限を剥がします。
-- app_user から products の追加権限を剥奪(参照は残す)
REVOKE INSERT ON products FROM app_user;
主な権限には、SELECT(読む)・INSERT(追加)・UPDATE(更新)・DELETE(削除)や、テーブルを作れる CREATE、消せる DROP などがあります。
flowchart LR
A["管理者"] -->|"GRANT SELECT, INSERT ON products"| U["app_user<br/>products を読む・足すだけ"]
A -->|"REVOKE INSERT ON products"| U2["app_user<br/>読むだけに戻す"]
ポイントは、操作(SELECT/INSERT…)× 対象(テーブル)× 相手(ユーザー) の3つの掛け算で、きめ細かく制御できることです。アプリ用のアカウントには「そのアプリに必要な操作だけ」を与えるのが鉄則です。
まとめ
- 権限は
GRANT 操作 ON 対象 TO 相手;で与え、REVOKE ... FROM ...;で取り上げる。 - 操作は
SELECT/INSERT/UPDATE/DELETEなどから必要なものだけを選ぶ。 - SQLite にはユーザー管理が無いので、これらはサーバー型 DB(MySQL/PostgreSQL/Oracle)での機能。