はじめに
Vertica7.2より、スキーマレベルの権限継承が可能になりました。従来は、新規にテーブルを作成した場合、その都度DBユーザーに作成したテーブルの権限付与が必要でした。Vertica7.2からは、予めDBユーザーにスキーマの権限を付与しておくことで、新規に作成したテーブルに対しても権限を自動で付与することできます。
本機能を利用した場合、従来と比べて権限付与のオペレーションを省略することができます。
スキーマレベル権限継承の動作確認
本機能を利用した場合の実行例をご紹介します。
構文
テーブルとビューで、本機能を利用することができます。
【GRANT文】
GRANT { { USAGE | CREATE | SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } | ALL [ PRIVILEGES ] }
ON [ schema name ]
TO { username | role | PUBLIC } [ , … ]GRANT文でスキーマに対しての権限をDBユーザやロールに割当てます。
【CREATE文】
CREATE SCHEMA { … } [ DEFAULT { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ];
「INCLUDE」:含める
「EXCLUDE」:含めないテーブルを新規で作成する場合、スキーマに付与された権限を含めるかどうかをスキーマレベルで指定します。デフォルトは「DEFAULT EXCLUDE SCHEMA PRIVILEGES」(含めない) でスキーマは作成されます。
CREATE [ … ] TABLE { … } [ { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ];
CREATE [ … ] VIEW { … } [ { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ] { … };
「INCLUDE」:含める
「EXCLUDE」:含めないテーブル/ビューに対してアクセス制御をする場合、スキーマに付与された権限を含めるかどうかを指定します。
【ALTER文】
ALTER DATABASE { … } SET DisableInheritedPrivileges=0;
「0」:権限継承は有効(デフォルト)
「1」:権限継承は無効データベースレベルで指定する場合は「DisableInheritedPrivileges」パラメーターを変更します。
ALTER SCHEMA { … } [ DEFAULT { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ];
ALTER TABLE { … } [ { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ];
ALTER VIEW { … } [ { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ];
「INCLUDE」:含める
「EXCLUDE」:含めないALTER文でスキーマ/テーブル/ビューの権限管理を変更できます。
実行結果
Vertica7.1とVertica7.2以降の動作は、以下のとおりになります。
【Vertica7.1まで】
user1=> CREATE SCHEMA s1;
CREATE SCHEMA
//user1が 「s1スキーマ」を作成
user1=> GRANT USAGE, CREATE ON SCHEMA s1 to user2;
GRANT PRIVILEGE
//user1がuser2に 「s1スキーマ」の権限付与
user1=> CREATE TABLE s1.t1 (id int);
CREATE TABLE
//user1が 「s1スキーマ」内に 「t1テーブル」を作成
user1=> GRANT select ON table s1.t1 to user2;
GRANT PRIVILEGE
//user1がuser2に 「t1テーブル」の権限付与
user2=> SELECT * FROM s1.t1;
id
----
(0 rows)
//user2は 「s1スキーマ」内の 「t1テーブル」が参照可能
user1=> CREATE TABLE s1.t2 (id int);
CREATE TABLE
//user1が 「s1スキーマ」内に 「t2テーブル」を新しく作成
user2=> SELECT * FROM s1.t2;
ERROR 4367: Permission denied for relation t2
//user2は権限不足で 「s1スキーマ」内の 「t2テーブル」が参照不可
user1=> GRANT select ON table s1.t2 to user2;
GRANT PRIVILEGE
//user1がuser2に「t2テーブル」の権限付与
user2=> SELECT * FROM s1.t2;
id
----
(0 rows)
//user2は 「s1スキーマ」内の 「t2テーブル」が参照可能【Vertica7.2から】
user1=> CREATE SCHEMA s1 DEFAULT INCLUDE SCHEMA PRIVILEGES;
CREATE SCHEMA
//user1が 「s1スキーマ」作成時に 「INCLUDE SCHEMA PRIVILEGES」を指定
user1=> GRANT USAGE, CREATE, SELECT ON SCHEMA s1 to user2;
GRANT PRIVILEGE
//user1がuser2に 「s1スキーマ」の権限付与
user1=> CREATE TABLE s1.t1 (id int);
WARNING 6978: Table "t2" will include privileges from schema "s1"
CREATE TABLE
//user1が 「t2テーブル」の作成時に 「s1スキーマ」の権限も含まれると警告
user2=> SELECT * FROM s1.t1;
id
----
(0 rows)
//user2は 「s1スキーマ」内の 「t1テーブル」が参照可能参考情報
・権限管理を容易にする方法(ロールについて)
https://www.ashisuto.co.jp/cm/analytics-database/create_role.html
・作成したロールの情報を確認する方法
https://www.ashisuto.co.jp/cm/analytics-database/role_informations.html
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。
更新履歴
2019/12/10 【ALTER文】項目の表現を一部修正
2019/04/15 検証バージョンを9.2に変更
2016/05/26 本記事を公開
