本文へスキップ
BecomeCoder

SQL テーブル設計 (DDL)コース · 第6章 権限とアクセス制御 · レッスン20

GRANT と REVOKE ― 権限を与える・取り上げる

ローカル実施

導入

会社のデータベースを、全社員が自由に消したり書き換えたりできたら大惨事です。「経理は売上テーブルを読める」「アプリ用のアカウントは注文の追加だけできる」――こうしたアクセス制御を担うのが DCL の GRANTREVOKE です。

説明

まず 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 ...; で取り上げる。
  • 操作は SELECTINSERTUPDATEDELETE などから必要なものだけを選ぶ。
  • SQLite にはユーザー管理が無いので、これらはサーバー型 DB(MySQL/PostgreSQL/Oracle)での機能。