はじめに
通常、新規にテーブル/ビューを作成する際、スキーマに付与されている権限が継承(※)されます。
例えば、スキーマに権限継承の設定がされていれば、そのスキーマに作成される新規テーブル/ビューに対して全てのスキーマ権限が継承されます。
スキーマに権限継承の設定がされていなければ、新規テーブル/ビューに対してスキーマ権限は継承されません。
ただし、CREATE TABLE/VIEWコマンドにオプション指定することにより、作成時に権限継承させるか否かを制御できます。
今回はオプションの指定方法とその動作を紹介いたします。
(※)権限継承の設定については、以下の記事をご参照ください。
新規にテーブルを作成した場合の権限管理 (7.2新機能)
https://www.ashisuto.co.jp/cm/analytics-database/schema_privileges.html
構文
CREATE TABLE [[データベース名.]スキーマ名.]テーブル名(列定義) [ EXCLUDE/INCLUDE PRIVILEGES ]EXCLUDE・・・スキーマ権限を継承しない
INCLUDE・・・スキーマ権限を継承する
次に2つのパターンを例に、オプションの使い方をご案内します。
パターン1:スキーマに権限継承の設定がされていない場合
概要
権限継承の設定をせずにスキーマを作成します。
通常、このスキーマに新規作成されるテーブル/ビューにはスキーマ権限は継承されませんが、
INCLUDE PRIVILEGESオプションを指定することで、作成時の指定により継承させられることを確認します。
詳細
①権限継承の設定を行わずにs1スキーマを作成します。
dbadmin=> CREATE SCHEMA s1;
CREATE SCHEMA②user1ユーザーを作成し、権限付与します。
dbadmin=> CREATE USER user1;
CREATE USER
dbadmin=> GRANT USAGE, SELECT ON SCHEMA s1 TO user1;
GRANT PRIVILEGE③権限検証に関するオプションを指定せずに t1 テーブルを作成します。
dbadmin=> CREATE TABLE s1.t1(col1 int);
CREATE TABLEスキーマ作成時に権限継承に関するオプションを指定をしなかった場合、「DEFAULT EXCLUDE SCHEMA PRIVILEGES」がデフォルトで設定されます。
④user1ユーザーにログインし、t1テーブルが参照できないことを確認します。
dbadmin=> \c user1 user1
You are now connected to database "user1" as user "user1".
user1=> \d
No relations found.
user1=> SELECT * FROM s1.t1;
ERROR 4367: Permission denied for relation t1⑤テーブル作成時、INCLUDE PRIVILEGESオプションを付与します。
user1=> \c dbadmin dbadmin
Password:
You are now connected to database "dbadmin" as user "dbadmin".
dbadmin=> CREATE TABLE s1.t2(col1 int) INCLUDE PRIVILEGES;
CREATE TABLE⑥t2テーブルが参照可能となっていることを確認します。
dbadmin=> \c user1 user1
You are now connected to database "user1" as user "user1".
user1=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+---------+---------
s1 | t2 | table | dbadmin |
(1 row)
user1=> SELECT * FROM s1.t2;
col1
------
(0 rows)パターン2:スキーマに権限継承の設定がされている場合
概要
権限継承の設定をしてスキーマを作成します。
通常、このスキーマに新規作成されるテーブル/ビューにはスキーマ権限が継承されますが、
EXCLUDE PRIVILEGESオプションを指定することで、権限の継承を無効にできることを確認します。
詳細
①権限継承の設定を行い、s2スキーマを作成します。
dbadmin=> CREATE SCHEMA s2 DEFAULT INCLUDE SCHEMA PRIVILEGES;
CREATE SCHEMA②user2ユーザーを作成し、権限付与します。
dbadmin=> CREATE USER user2;
CREATE USER
dbadmin=> GRANT USAGE, SELECT ON SCHEMA s2 TO user2;
GRANT PRIVILEGE③権限検証に関するオプションを指定せずに t1 テーブルを作成します。
dbadmin=> CREATE TABLE s2.t1(col1 int);
WARNING 6978: Table "t1" will include privileges from schema "s2"
CREATE TABLE④user2ユーザーにログインし、t1テーブルが参照可能となっていることを確認します。
dbadmin=> \c user2 user2
You are now connected to database "user2" as user "user2".
user2=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+---------+---------
s2 | t1 | table | dbadmin |
(1 row)
user2=> SELECT * FROM s2.t1;
col1
------
(0 rows)⑤テーブル作成時、EXCLUDE PRIVILEGESオプションを付与します。
user2=> \c dbadmin dbadmin
Password:
You are now connected to database "dbadmin" as user "dbadmin".
dbadmin=> CREATE TABLE s2.t2(col1 int) EXCLUDE PRIVILEGES;
CREATE TABLE⑥t2テーブルが参照できないことを確認します。
dbadmin=> \c user2 user2
You are now connected to database "user2" as user "user2".
user2=> \d
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+---------+---------
s2 | t1 | table | dbadmin |
(1 row)
user2=> SELECT * FROM s2.t2;
ERROR 4367: Permission denied for relation t2参考情報
新規にテーブルを作成した場合の権限管理 (7.2新機能)
https://www.ashisuto.co.jp/cm/analytics-database/schema_privileges.html
Inherited Privileges
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/AdministratorsGuide/DBUsersAndPrivileges/Privileges/InheritedPrivilegesOverview.htm
Setting Privileges Inheritance on Tables and Views
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/AdministratorsGuide/DBUsersAndPrivileges/Privileges/TableViewInheritance.htm
Enabling Database Inheritance
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/AdministratorsGuide/DBUsersAndPrivileges/Privileges/EnableDatabaseInheritance.htm
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。
更新履歴
2019/11/29 本記事を公開