Pivotal Knowledge Base

フォローする

HAWQまたはGreenplum DatabaseのACL権限をデータベースビューで整理する方法について

この記事では、HAWQまたはGreenplum databaseにおいてテーブル・ユーザ権限を識別するためのACL権限の基本的な理解を提供する。また、使いやすいビューでRelcalコードを整理するデータベースビューの例を挙げる。

HAWQ/Greenplum databaseでは多数のテーブルと複数のユーザを持つことができる。したがって、管理者参照用のテーブルとユーザアクセス権限にする関連情報を維持する必要がある。これらの情報はpg_class system catalogテーブルのralaclカラムに格納されていて、権限はコードの形で維持されている。(例:arwdxt)

以下はrelaclコードの意味である

a - Insert
r - SELECT
w - UPDATE
d - DELETE
R - RULES
x - REFERENCES
t - TRIGGER
arwdRxt - ALL

以下はACL権限を確認するための一例である。これはrelaclの値はgpadminユーザがすべての権限を持っていて、そしてgpadminユーザも権限授与者であることを示している。 

gpadmin=# select relname,relacl from pg_class where relname ~ 'hawq_log_database';
relname | relacl
----------------------------------------------------------------+----------------- hawq_log_database | {gpadmin=arwdxt/gpadmin}

以下はrelaclのフォーマットである

<grantee>=<privileges>/<grantor>

以上の格納情報は未加工の状態で、必要に応じて変更することもできる。この後の例では、relaclカラムに格納されている情報を使用するためにビューを作り、そしてその説明を含んだアウトプットを提供する。これにより、ビューをクエリするときにテーブルまたはユーザ名により操作することもできる。

ノート:以下作成したビューはHAWQのもので、Greeplum Databaseでは UPDATE/DELETEまたほかの権限などを追記することができる。

1) リレーション名をもとにするクエリ

gpadmin=# select * from dba_role_view where table_name like 'emp';
relname | nspname | grantee | user_priviliges | grantor | notes
---------+---------+-----------+-----------------+---------+----------------------------------------------------------------------
emp | public | gpadmin | SELECT,INSERT | gpadmin | UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x
emp | public | foo | SELECT,INSERT | gpadmin | UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x
emp | public | foo_child | SELECT,INSERT | foo | UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x

2) 権限を与えられたユーザをもとにするクエリ

gpadmin=# select * from dba_role_view where grantee like 'foo';
relname | nspname | grantee | user_priviliges | grantor | notes
---------+---------+---------+-----------------+---------+----------------------------------------------------------------------
emp | public | foo | SELECT,INSERT | gpadmin | UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x

3) 権限を与えるユーザをもとにするクエリ

gpadmin=# select * from dba_role_view where grantor like 'foo';
relname | nspname | grantee | user_priviliges | grantor | notes

---------+---------+-----------+-----------------+---------+----------------------------------------------------------------------
emp | public | foo_child | SELECT,INSERT | foo | UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x

ビューの定義

 SELECT b.table_name, b.schema_name, b.grantee, b.user_priviliges, b.grantor, b.notes
FROM ( SELECT a.relname AS table_name, a.nspname AS schema_name,
CASE
WHEN length(a.user_scope) > 0 THEN a.user_scope
ELSE 'PUBLIC'::text
END AS grantee,
CASE
WHEN "position"(a.acl_detail, 'r'::text) > 0 THEN 'SELECT'::text
ELSE ''::text
END ||
CASE
WHEN "position"(a.acl_detail, 'a'::text) > 0 THEN ',INSERT'::text
ELSE ''::text
END AS user_priviliges,
a.grantor, 'UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x' AS notes
FROM
( SELECT c.relname, n.nspname, split_part(regexp_split_to_table(array_to_string(c.relacl, ','::text), ','::text), '='::text, 1) AS user_scope, split_part(split_part(regexp_split_to_table(array_to_string(c.relacl, ','::text), ','::text), '='::text, 2), '/'::text, 1) AS acl_detail, split_part(split_part(regexp_split_to_table(array_to_string(c.relacl, ','::text), ','::text), '='::text, 2), '/'::text, 2) AS grantor
FROM pg_class c, pg_namespace n
WHERE c.relnamespace = n.oid) a
UNION ALL
SELECT c.relname AS table_name, n.nspname AS schema_name, pgt.tableowner AS grantee, 'SELECT,INSERT' AS user_priviliges, pgt.tableowner AS grantor, 'UPDATE, DELETE, REFERENCES operation are not supported with HAWQ 1.x' AS notes
FROM pg_class c, pg_namespace n, pg_tables pgt
WHERE c.relnamespace = n.oid AND c.relname = pgt.tablename AND n.nspname = pgt.schemaname AND array_to_string(c.relacl, ','::text) IS NULL) b;

その他:
Pivotal社員内部参照はこちら: GPSQL-1860

コメント

Powered by Zendesk