目次
はじめに
通常、新規にテーブル/ビューを作成する際、スキーマに付与されている権限が継承(※)されます。例えば、スキーマに権限継承の設定がされていれば、そのスキーマに作成される新規テーブル/ビューに対して全てのスキーマ権限が継承されます。
スキーマに権限継承の設定がされていなければ、新規テーブル/ビューに対してスキーマ権限は継承されません。
ただし、CREATE TABLE/VIEWコマンドにオプション指定することにより、作成時に権限継承させるか否かを制御できます。
今回はオプションの指定方法とその動作を紹介いたします。
(※)権限継承の設定については、以下の記事をご参照ください。
新規にテーブルを作成した場合の権限管理 (7.2新機能)
http://vertica-tech.ashisuto.co.jp/schema_privileges/
構文
1 |
CREATE TABLE [[データベース名.]スキーマ名.]テーブル名(列定義) [ EXCLUDE/INCLUDE PRIVILEGES ] |
EXCLUDE・・・スキーマ権限を継承しない
INCLUDE・・・スキーマ権限を継承する
次に2つのパターンを例に、オプションの使い方をご案内します。
パターン1:スキーマに権限継承の設定がされていない場合
概要
権限継承の設定をせずにスキーマを作成します。通常、このスキーマに新規作成されるテーブル/ビューにはスキーマ権限は継承されませんが、
INCLUDE PRIVILEGESオプションを指定することで、作成時の指定により継承させられることを確認します。
詳細
①権限継承の設定を行わずにs1スキーマを作成します。
1 2 |
dbadmin=> CREATE SCHEMA s1; CREATE SCHEMA |
②user1ユーザーを作成し、権限付与します。
1 2 3 4 5 |
dbadmin=> CREATE USER user1; CREATE USER dbadmin=> GRANT USAGE, SELECT ON SCHEMA s1 TO user1; GRANT PRIVILEGE |
③権限検証に関するオプションを指定せずに t1 テーブルを作成します。
1 2 |
dbadmin=> CREATE TABLE s1.t1(col1 int); CREATE TABLE |
スキーマ作成時に権限継承に関するオプションを指定をしなかった場合、「DEFAULT EXCLUDE SCHEMA PRIVILEGES」がデフォルトで設定されます。
④user1ユーザーにログインし、t1テーブルが参照できないことを確認します。
1 2 3 4 5 6 7 8 |
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オプションを付与します。
1 2 3 4 5 6 |
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テーブルが参照可能となっていることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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スキーマを作成します。
1 2 |
dbadmin=> CREATE SCHEMA s2 DEFAULT INCLUDE SCHEMA PRIVILEGES; CREATE SCHEMA |
②user2ユーザーを作成し、権限付与します。
1 2 3 4 5 |
dbadmin=> CREATE USER user2; CREATE USER dbadmin=> GRANT USAGE, SELECT ON SCHEMA s2 TO user2; GRANT PRIVILEGE |
③権限検証に関するオプションを指定せずに t1 テーブルを作成します。
1 2 3 |
dbadmin=> CREATE TABLE s2.t1(col1 int); WARNING 6978: Table "t1" will include privileges from schema "s2" CREATE TABLE |
④user2ユーザーにログインし、t1テーブルが参照可能となっていることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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オプションを付与します。
1 2 3 4 5 6 |
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テーブルが参照できないことを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 |
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新機能)http://vertica-tech.ashisuto.co.jp/schema_privileges/
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