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;
| 権限 | 対象操作 | 注意点 |
|---|---|---|
| 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(); -- 関数でログインユーザーの部署を取得
読了ボタンを누すとトップページの進捉に反柼されます