目次
はじめに
Verticaでは、特定のテーブルに行アクセス・ポリシーを作成できます。
本記事では、行アクセス・ポリシーの基本的な使用方法をご紹介します。
概要
テーブルに行アクセス・ポリシーを作成することで、データ参照のアクセスを制御することが可能になります。
行アクセス・ポリシーが作成されたテーブルにユーザーがクエリを実行すると、Verticaはテーブルのデータに対して行アクセス・ポリシーのWHERE式を評価します。
クエリは、行アクセス・ポリシーのWHERE式がtrueと評価された行のみを返します。
行アクセス・ポリシーの作成方法
データ参照のアクセスを制御するためには、CREATE ACCESS POLICY文を使用して行アクセス・ポリシーを作成します。
本記事で紹介する実行例は、次の内容を示します。
employees表に対して行アクセス・ポリシーを作成
manager_topロールに対しては、全てのデータが参照可能
manager_1ロールに対しては、dept_idr列が100のデータのみ参照可能
manager_2ロールに対しては、dept_idr列が200のデータのみ参照可能
テーブルとデータを確認
行アクセス・ポリシーで使用するデータを確認します。
1 2 3 4 5 6 7 8 9 10 |
dbadmin=> select * from employees; empid | depid | salary | rate -------+-------+---------+------ 1 | 100 | 3000.00 | 5 2 | 100 | 5000.00 | 3 3 | 100 | 2000.00 | 7 4 | 200 | 8000.00 | 4 5 | 200 | 9000.00 | 8 6 | 200 | 4000.00 | 2 (6 rows) |
ロールとユーザを作成
各データベースユーザに対して、対象テーブルへの参照権限や、データ参照のアクセスを制御するためにロールを付与します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* 行アクセス・ポリシー対象のロール作成、ユーザ作成、ロール付与、権限付与*/ dbadmin=> create role manager_top; CREATE ROLE dbadmin=> create role manager_100; CREATE ROLE dbadmin=> create role manager_200; CREATE ROLE dbadmin=> create user manager; CREATE USER dbadmin=> create user manager_1; CREATE USER dbadmin=> create user manager_2; CREATE USER dbadmin=> grant manager_top to manager; GRANT ROLE dbadmin=> grant manager_100 to manager_1; GRANT ROLE dbadmin=> grant manager_200 to manager_2; GRANT ROLE dbadmin=> alter user manager default role manager_top; ALTER USER dbadmin=> alter user manager_1 default role manager_100; ALTER USER dbadmin=> alter user manager_2 default role manager_200; ALTER USER dbadmin=> grant select on employees to manager; GRANT PRIVILEGE dbadmin=> grant select on employees to manager_1; GRANT PRIVILEGE dbadmin=> grant select on employees to manager_2; GRANT PRIVILEG |
行アクセス・ポリシーを作成
CREATE ACCESS POLICY文でemployees表に行アクセス・ポリシーを作成します。
WHERE式でtrueと評価されたデータのみ参照可能にします。
1 2 3 4 5 6 7 8 |
dbadmin=> CREATE ACCESS POLICY ON employees FOR ROWS dbadmin-> WHERE dbadmin-> enabled_role('manager_top') OR //manager_topロールに対しては、全データ参照可能 dbadmin-> ( enabled_role('manager_100') and depid = 100 ) OR //manager_100ロールに対しては、depid = 100 のデータのみ参照可能 dbadmin-> ( enabled_role('manager_200') and depid = 200 ) //manager_200ロールに対しては、depid = 200 のデータのみ参照可能 dbadmin-> ENABLE dbadmin-> ; CREATE ACCESS POLICY |
行アクセス・ポリシーの結果を確認
行アクセス・ポリシー作成後のデータを確認します。
ユーザ(付与されているロール)に応じて、データ参照が制御されていることが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/* managerユーザ(manager_topロール)でデータ参照 */ manager=> select current_user(); current_user -------------- manager (1 row) manager=> select * from employees; empid | depid | salary | rate -------+-------+---------+------ 1 | 100 | 3000.00 | 5 2 | 100 | 5000.00 | 3 3 | 100 | 2000.00 | 7 4 | 200 | 8000.00 | 4 5 | 200 | 9000.00 | 8 6 | 200 | 4000.00 | 2 (6 rows) /* manager_1ユーザ(manager_100ロール)でデータ参照 */ manager_1=> select current_user(); current_user -------------- manager_1 (1 row) manager_1=> select * from employees; empid | depid | salary | rate -------+-------+---------+------ 1 | 100 | 3000.00 | 5 2 | 100 | 5000.00 | 3 3 | 100 | 2000.00 | 7 (3 rows) /* manager_2ユーザ(manager_200ロール)でデータ参照 */ manager_2=> select current_user(); current_user -------------- manager_2 (1 row) manager_2=> select * from employees; empid | depid | salary | rate -------+-------+---------+------ 4 | 200 | 8000.00 | 4 5 | 200 | 9000.00 | 8 6 | 200 | 4000.00 | 2 (3 rows) |
行アクセス・ポリシーの制限事項
以下の制限事項があるため、ご留意ください。
・テーブルに含めることができる行アクセス・ポリシーは1つだけです。
・次のテーブルでは、行アクセス・ポリシーは無効です。
– aggregate projectionsのあるテーブル
– 一時テーブル
– システムテーブル
– ビュー
・行アクセス・ポリシーを使用してテーブルにダイレクトクエリを作成することはできません。
参考情報
Access Policies
CREATE ACCESS POLICY
検証バージョンについて
この記事の内容はVertica 10.0で確認しています。
更新履歴
2020/09/24 本記事を公開