SQLサーバーは、ロール、ユーザー権限(GRANT/REVOKE)、およびスキーマ(schemas)を通じて多層的なアクセス権限システムをサポートしています。重要な原則は次のとおりです:
ロールと権限の割り当ての例:
-- アナリスト用のロールを作成 CREATE ROLE Analyst; -- 必要なテーブルに対して SELECT のみを付与 GRANT SELECT ON Sales TO Analyst; -- データの変更を禁止 REVOKE INSERT, UPDATE, DELETE ON Sales FROM Analyst; -- ユーザーにロールを割り当て GRANT Analyst TO user_ivan;
よく、読み取り(read-only)、変更、管理、および特定の操作のためのロールが区別されます。
引っかけ:「ビュー(VIEW)のみにアクセスする権限を持つユーザーは、ビューを通じて基になるテーブルを変更できますか? 例を挙げてください。」
回答: はい、VIEWが集約/グルーピングを含まず、読み取り専用(WITH CHECK OPTION)でない場合、VIEWでINSERT/UPDATE/DELETEを実行でき、許可されている場合は基になるテーブルに変更が反映されます。
-- 不要な列を省くビュー CREATE VIEW SalesAsView AS SELECT id, total, manager_id FROM Sales; -- 許可されていれば、ユーザーは次のように変更を加えます: UPDATE SalesAsView SET total=1000 WHERE id=42; -- これにより、Sales.totalがid=42に影響します
解決策:readonly VIEWのみを使用するか、ビューを通じてデータ変更の権限を禁止します。
ストーリー
プロジェクト: HRポータル、従業員の個人データ。
エラー: オペレーターはVIEWを介して基になるテーブルへのUPDATE権限なしにアクセスでき、互いに給与を偶然に変更しました。元々は「レポート専用」として設計されていました。
ストーリー
プロジェクト: 簿記、外部統合。
エラー: 外部システムに全DBに対してINSERTおよびSELECTの権限を与え、必要なテーブルに対してのみINSERTを許可しました。結果:DB全体の読み取りの脆弱性とGDPRに違反する可能性。
ストーリー
プロジェクト: SaaSプラットフォーム、マルチユーザーのレポート。
エラー: すべてのクライアントが共通の権限を持つ同じスキーマで作業しており、他人のデータを偶然に見たり、編集したりできました。解決策は、スキーマを分割し、個別のロールを設定し、Row Level Security (RLS)レベルで独自の制限を設けることです。