はじめに
Vertica7.2より、スキーマレベルの権限継承が可能になりました。従来は、新規にテーブルを作成した場合、その都度DBユーザーに作成したテーブルの権限付与が必要でした。Vertica7.2からは、予めDBユーザーにスキーマの権限を付与しておくことで、新規に作成したテーブルに対しても権限を自動で付与することできます。本機能を利用した場合、従来と比べて権限付与のオペレーションを省略することができます。
スキーマレベル権限継承の動作確認
本機能を利用した場合の実行例をご紹介します。構文
テーブルとビューで、本機能を利用することができます。【GRANT文】
1 2 3 |
GRANT { { USAGE | CREATE | SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } | ALL [ PRIVILEGES ] } ON [ schema name ] TO { username | role | PUBLIC } [ , … ] |
GRANT文でスキーマに対しての権限をDBユーザやロールに割当てます。
【CREATE文】
1 2 3 4 |
CREATE SCHEMA { … } [ DEFAULT { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ]; 「INCLUDE」:含める 「EXCLUDE」:含めない |
テーブルを新規で作成する場合、スキーマに付与された権限を含めるかどうかをスキーマレベルで指定します。デフォルトは「DEFAULT EXCLUDE SCHEMA PRIVILEGES」(含めない) でスキーマは作成されます。
1 2 3 4 5 |
CREATE [ … ] TABLE { … } [ { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ]; CREATE [ … ] VIEW { … } [ { INCLUDE | EXCLUDE } [SCHEMA] PRIVILEGES ] { … }; 「INCLUDE」:含める 「EXCLUDE」:含めない |
テーブル/ビューに対してアクセス制御をする場合、スキーマに付与された権限を含めるかどうかを指定します。
【ALTER文】
1 2 3 4 |
ALTER DATABASE { … } SET DisableInheritedPrivileges=0; 「0」:権限継承は有効(デフォルト) 「1」:権限継承は無効 |
データベースレベルで指定する場合は「DisableInheritedPrivileges」パラメーターを変更します。
1 2 3 4 5 6 |
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まで】
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 |
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から】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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テーブル」が参照可能 |
参考情報
・権限管理を容易にする方法(ロールについて)http://vertica-tech.ashisuto.co.jp/create_role/
・作成したロールの情報を確認する方法
http://vertica-tech.ashisuto.co.jp/role_informations/
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。更新履歴
2019/12/10 【ALTER文】項目の表現を一部修正2019/04/15 検証バージョンを9.2に変更
2016/05/26 本記事を公開
- 投稿タグ
- 権限, 権限管理, 継承, PRIVILEGES, vs_tables, InheritPrivileges