はじめに
Verticaでは、特定のテーブルに行アクセス・ポリシーを作成できます。
本記事では、行アクセス・ポリシーの基本的な使用方法をご紹介します。
概要
テーブルに行アクセス・ポリシーを作成することで、データ参照のアクセスを制御することが可能になります。
行アクセス・ポリシーが作成されたテーブルにユーザーがクエリを実行すると、Verticaはテーブルのデータに対して行アクセス・ポリシーのWHERE式を評価します。
クエリは、行アクセス・ポリシーのWHERE式がtrueと評価された行のみを返します。
行アクセス・ポリシーの作成方法
データ参照のアクセスを制御するためには、CREATE ACCESS POLICY文を使用して行アクセス・ポリシーを作成します。
本記事で紹介する実行例は、次の内容を示します。
employees表に対して行アクセス・ポリシーを作成
manager_topロールに対しては、全てのデータが参照可能
manager_1ロールに対しては、dept_idr列が100のデータのみ参照可能
manager_2ロールに対しては、dept_idr列が200のデータのみ参照可能
テーブルとデータを確認
行アクセス・ポリシーで使用するデータを確認します。
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)ロールとユーザを作成
各データベースユーザに対して、対象テーブルへの参照権限や、データ参照のアクセスを制御するためにロールを付与します。
/* 行アクセス・ポリシー対象のロール作成、ユーザ作成、ロール付与、権限付与*/
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と評価されたデータのみ参照可能にします。
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行アクセス・ポリシーの結果を確認
行アクセス・ポリシー作成後のデータを確認します。
ユーザ(付与されているロール)に応じて、データ参照が制御されていることが分かります。
/* 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 本記事を公開