データベース、テーブルの操作権限とロール
データベース、テーブル、ビューなどへのロール設定の確認方法と、ロールごとの閲覧、挿入、削除といった操作権限を設定する方法についてです。
ロールはユーザーやグループを意味するもので詳しくはPostgreSQL ユーザー(ロール)管理
を参照してください。
まずは、データベースやテーブルのロール設定の確認方法についてです。
- ad -
データベースやテーブルのロールの確認
テーブルごとのロール設定の確認は、psql の \dp コマンドで行います。
=> \dp ... Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+--------------+----------+-------------------------+-------------------+---------- public | test | table | | |
テーブルごとのロール設定は Access privileges
項目をみます。
上記の例ではアクセス権限はデフォルトの状態で、 Access privileges
から分かるように何もロールの設定がされていません。
テーブルごとのロール設定
テーブルごとにロールの設定を確認するには、\dp コマンドに続いてテーブル名を指定します。
=> \dp table_name ...
テーブルごとのロールの設定は以下のテーブルのロール設定
を参照してください。
システムオブジェクトのロールの確認
システムオブジェクトとは、PostgreSQL がデータベースが管理するためのデータが入ったテーブル、テーブルビューのことです。
このシステムオブジェクトにもロールを設定することができます。
PostgreSQLのシステムオブジェクトを確認するには、\dS[+] コマンドを実行します。
\dS ... List of relations Schema | Name | Type | Owner ------------+---------------------------------+----------+---------- pg_catalog | pg_aggregate | table | postgres pg_catalog | pg_am | table | postgres pg_catalog | pg_amop | table | postgres pg_catalog | pg_amproc | table | postgres pg_catalog | pg_attrdef | table | postgres pg_catalog | pg_attribute | table | postgres pg_catalog | pg_auth_members | table | postgres pg_catalog | pg_authid | table | postgres pg_catalog | pg_available_extension_versions | view | postgres pg_catalog | pg_available_extensions | view | postgres ...
上記の例ではデフォルトのスーパーユーザーであるpostgres
がシステムオブジェクトの操作権限をもつことが分かります。
データベースのロール設定
ロール設定は、データベース、スキーマ、テーブル、ビュー、カラムごとに操作権限が設定できます。ロール設定には GRANT コマンドを使います。
以下は、データベースに関するロールの設定です。
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
権限には以下があります。
権限名 | 概要 |
---|---|
CREATE | データベースの場合は、新規スキーマの作成を許可 |
CONNECT | データベースへのアクセスを許可。閲覧?新規追加、削除などは?この権限は、アクセス開始時にpg_hba.confの設定と共に検査される。 |
TEMPORARY | 一時テーブルの作成を許可 |
TEMP | TEMPORARYに同じ |
ALL | 上記のすべてを許可 |
例えば、あるロールにデータベースへのアクセスを許可する場合は以下のようにします。
=> GRANT CONNECT ON DATABASE database_name TO role_name;
スキーマ、テーブル、ビューごとのロール設定
スキーマ、テーブル、ビューごとにロールを設定することができます。
スキーマのロール設定
スキーマーの操作を許諾させるためには、データベースへのログイン許可が必要です。 もしもスキーマ以下のテーブルの操作を許可するには、スキーマへのアクセスを許可しなければなりません。
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
権限は以下のようになっています。
SELECT | レコードを閲覧 |
INSERT | レコードを新規追加 |
UPDATE | レコードの更新 |
DELETE | レコードの削除 |
TRUNCATE | テーブルの全レコードを削除 |
REFERENCES | 外部キー制約の作成 |
TRIGGER | トリガの作成 |
CREATE | スキーマやテーブルなどのオブジェクトの作成 |
CONNECT | 接続許可 |
TEMPORARY | 一時テーブルの作成 |
EXECUTE | 関数やプロシージャ、演算子の使用を許可 |
USAGE | 対象がスキーマの場合、オブジェクトへのアクセスを許可する 対象がそれ以外の場合、対象に応じた権限が付与される |
ALL PRIVILEGES | 利用可能な権限を全て許可 |
=> ALTER ROLE new_name WITH LOGIN; /* ロールのログインの許可 */ => GRANT USAGE ON SCHEMA schema_name To role_name; /* スキーマのアクセス許可 */
テーブルのロール設定
テーブルへの認証を許可するには、データベースへのログイン、スキーマのアクセスを許可する必要があります。
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
=> ALTER ROLE new_name WITH LOGIN; /* ロールのログインの許可 */ => GRANT USAGE ON SCHEMA schema_name To role_name; /* スキーマのアクセス許可 */ => GRANT SELECT ON table_name To role_name; /* テーブルの閲覧を許可 */
カラムごとのロール設定
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT SELECT (column_name) ON table_name To role_name;
外部からPostgreSQLのデータ操作をするには、そのユーザーでPostgreSQLへのログインを許可する必要があります。
ログイン認証については「ログイン認証とロールの設定」を参照して下さい。