ユーザーごとに複数ポリシーの組み合わせ
Amazon Redshift の RLS は、ユーザーとオブジェクトごとに複数ポリシーのアタッチをサポートしています。1 人のユーザーに対して複数ポリシーが定義されていると、Amazon Redshift は、テーブル上の RLS CONJUNCTION TYPE に応じて、AND 構文または OR 構文ですべてのポリシーを適用します。設定タイプの詳細については、「ALTER TABLE」を参照してください。
テーブルの複数ポリシーをお客様に関連付けることができます。複数のポリシーが直接お客様にアタッチされているか、複数のロールに属していて、ロールに異なるポリシーがアタッチされています。
複数のポリシーで特定の関係の行アクセスを制限する必要がある場合、関係の RLS CONJUNCTION TYPE を AND に設定できます。次の例を考えます。Alice は、指定されたポリシーで「キャットネーム」が「NBA」になっているスポーツイベントしか見ることができません。
-- Create an analyst role and grant it to a user named Alice. CREATE ROLE analyst; CREATE USER alice WITH PASSWORD 'Name_is_alice_1'; GRANT ROLE analyst TO alice; -- Create an RLS policy that only lets the user see sports. CREATE RLS POLICY policy_sports WITH (catgroup VARCHAR(10)) USING (catgroup = 'Sports'); -- Create an RLS policy that only lets the user see NBA. CREATE RLS POLICY policy_nba WITH (catname VARCHAR(10)) USING (catname = 'NBA'); -- Attach both to the analyst role. ATTACH RLS POLICY policy_sports ON category TO ROLE analyst; ATTACH RLS POLICY policy_nba ON category TO ROLE analyst; -- Activate RLS on the category table with AND CONJUNCTION TYPE. ALTER TABLE category ROW LEVEL SECURITY ON CONJUNCTION TYPE AND; -- Change session to Alice. SET SESSION AUTHORIZATION alice; -- Select all from the category table. SELECT catgroup, catname FROM category; catgroup | catname ---------+--------- Sports | NBA (1 row)
複数のポリシーによって、ユーザーが特定の関係で、より多くの行を表示できるようにする必要がある場合、ユーザーはそのリレーションの RLS CONJUNCTION TYPE を OR に設定できます。次の例を考えます。Alice は、指定されたポリシーに従って「コンサート」と「スポーツ」しか表示できません。
-- Create an analyst role and grant it to a user named Alice. CREATE ROLE analyst; CREATE USER alice WITH PASSWORD 'Name_is_alice_1'; GRANT ROLE analyst TO alice; -- Create an RLS policy that only lets the user see concerts. CREATE RLS POLICY policy_concerts WITH (catgroup VARCHAR(10)) USING (catgroup = 'Concerts'); -- Create an RLS policy that only lets the user see sports. CREATE RLS POLICY policy_sports WITH (catgroup VARCHAR(10)) USING (catgroup = 'Sports'); -- Attach both to the analyst role. ATTACH RLS POLICY policy_concerts ON category TO ROLE analyst; ATTACH RLS POLICY policy_sports ON category TO ROLE analyst; -- Activate RLS on the category table with OR CONJUNCTION TYPE. ALTER TABLE category ROW LEVEL SECURITY ON CONJUNCTION TYPE OR; -- Change session to Alice. SET SESSION AUTHORIZATION alice; -- Select all from the category table. SELECT catgroup, count(*) FROM category GROUP BY catgroup ORDER BY catgroup; catgroup | count ---------+------- Concerts | 3 Sports | 5 (2 rows)