frecuencia ⏱ 7分★★★☆☆

権限管理

GRANT/REVOKE・ロール・ビューによるアクセス制御を完全習得

DBの権限管理はオブジェクト(テーブル・ビュー・プロシージャ)に対して「誰が何をできるか」を制御する。SQLでは GRANT で付与、REVOKE で剥奪する。

-- 権限の付与
GRANT  SELECT, INSERT ON 受注 TO  app_user;
GRANT  ALL PRIVILEGES  ON 受注 TO  admin_user;

-- WITH GRANT OPTION:受け取ったユーザーが他者に付与可能になる
GRANT  SELECT ON 顧客 TO manager WITH GRANT OPTION;

-- 権限の剥奪
REVOKE SELECT ON 受注 FROM app_user;

-- CASCADE:付与先がさらに他者に渡した権限も連鎖して剥奪
REVOKE SELECT ON 顧客 FROM manager CASCADE;
WITH GRANT OPTION で付与した権限を REVOKE する場合、CASCADE を指定しないと再付与された権限が残る場合がある。
権限対象操作注意点
SELECT参照列単位で付与可能
INSERT行の挿入列単位で付与可能
UPDATE行の更新列単位で付与可能
DELETE行の削除列単位指定は不可
REFERENCES外部キー参照参照先テーブルに必要
EXECUTEプロシージャ実行ルーティン(関数・プロシージャ)に使う
ALL PRIVILEGES全権限一括開発環境でのみ推奨

ロールはユーザーに権限をまとめて付与する「権限セットの名前」。個別ユーザーへの直接付与より管理が効率的。

-- ロールの作成と権限付与
CREATE ROLE report_viewer;
GRANT SELECT ON 売上集計 TO report_viewer;
GRANT SELECT ON 顧客     TO report_viewer;

-- ユーザーへのロール付与
GRANT report_viewer TO user_alice;
GRANT report_viewer TO user_bob;

-- ロールの剥奪(権限は自動的に失う)
REVOKE report_viewer FROM user_alice;
担当者が変わってもロールを再付与するだけでよい。個別権限のメンテナンスが不要になる。
-- 特定列を隠すビューで機密情報を保護
CREATE VIEW 顧客公開 AS
  SELECT 顧客ID, 顧客名, 都道府県   -- 電話・クレカ列を除外
  FROM   顧客;

GRANT SELECT ON 顧客公開 TO general_staff;
-- 元の「顧客」テーブルへのSELECT権限は付与しない
-- 行レベルのフィルタリング(担当部署のデータのみ)
CREATE VIEW 自部署受注 AS
  SELECT * FROM 受注
  WHERE  部署ID = CURRENT_USER_DEPT();  -- 関数でログインユーザーの部署を取得

📝 理解度チェック

GRANT SELECT ON テーブルA TO userX WITH GRANT OPTION の意味として正しいのはどれか?
RBACでロールを使う最大のメリットはどれか?
ビューを使ったアクセス制御の目的として最も適切なのはどれか?

読了ボタンを누すとトップページの進捉に反柼されます