このセクションでは、オーナーが異なるデータベースのテーブルへのアクセス権限付与について紹介します。データベースのオーナーはデータベース自体を削除できてしまいますが、オーナーではないユーザーには削除権限がないため、テーブルへのアクセスができるがデータベース自体は削除させたくない場合に活用できます。

アクセス権限を付与する前の状態

postgres ユーザーでデータベースに接続します。

-bash-4.2$ psql -U postgres
Password for user postgres: 
psql (11.1)
Type "help" for help.

postgres=# 

データベースを作成します。ここでは、pgdb01 の名前のデータベースを作成しています。

postgres=# create database pgdb01;
CREATE DATABASE
postgres=# 

データベースが作成されていることを確認します。

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 pgdb01    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

postgres=# 

pgdb01 のデータベースへ切り替えます。

postgres=# \c pgdb01
You are now connected to database "pgdb01" as user "postgres".
pgdb01=# 

pgdb01 データベースのテーブルへのアクセス権限を表示します。データベース作成した時点では、オーナーしたアクセス権限が付与されていない( Access privileges が空白)ことが確認できます。

pgdb01=# \z
                            Access privileges
 Schema | Name | Type  | Access privileges | Column privileges | Policies 
--------+------+-------+-------------------+-------------------+----------
 public | t1   | table |                   |                   | 
(1 row)

pgdb01=#

pgdb01 のデータベースにテーブルを作成します。

pgdb01=# create table t1 (c1 int, c2 int);
CREATE TABLE
pgdb01=# 

テーブル t1 の情報を表示します。

pgdb01=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 c1     | integer |           |          | 
 c2     | integer |           |          | 

pgdb01=# 

データベースのオーナーとは異なるユーザーで、作成したデータベースに接続します。ここでは、オーナーである postgres ユーザーとは異なる pguser ユーザーで、pgdb01 データベースに接続しています。

pgdb01=# quit
-bash-4.2$

-bash-4.2$ psql -U pguser -d pgdb01
Password for user pguser: 
psql (11.1)
Type "help" for help.

pgdb01=> 

テーブル t1 の情報を表示します。

pgdb01=> \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 c1     | integer |           |          | 
 c2     | integer |           |          | 

pgdb01=> 

テーブル t1 に対して データを登録します。アクセス権限が付与されていないため、テーブル t1 に対するアクセスが拒否されます。

pgdb01=> insert into t1 values(1,1);
ERROR:  permission denied for table t1
pgdb01=>

アクセス権限を付与した状態

postgres ユーザーでデータベースに接続します。

pgdb01=# quit
-bash-4.2$

-bash-4.2$ psql -U postgres
Password for user postgres: 
psql (11.1)
Type "help" for help.

postgres=# 

pgdb01 データベースへ切り替えます。

postgres=# \c pgdb01
You are now connected to database "pgdb01" as user "postgres".
pgdb01=# 

pguser ユーザーに対して、テーブルへの全てのアクセス権限を付与します。

pgdb01=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO pguser;
GRANT
pgdb01=# 

pgdb01 データベースのテーブルへのアクセス権限を表示します。pguser ユーザーに テーブルへの全てのアクセス権限が付与されていることが確認できます。

aINSERT可能(apend)
rSELECT可能(read)
wUPDATE可能(write)
dDELETE可能(delete)
DTRUNCATE
xREFERENCES
tTRIGGER
/ ****この権限を付与したロール
pgdb01=# \z
                                Access privileges
 Schema | Name | Type  |     Access privileges     | Column privileges | Policies 
--------+------+-------+---------------------------+-------------------+----------
 public | t1   | table | postgres=arwdDxt/postgres+|                   | 
        |      |       | pguser=arwdDxt/postgres   |                   | 
(1 row)

pgdb01=# 

データベースのオーナーとは異なるユーザーで、作成したデータベースに接続します。ここでは、オーナーである postgres ユーザーとは異なる pguser ユーザーで、pgdb01 データベースに接続しています。

pgdb01=# quit
-bash-4.2$ 

-bash-4.2$ psql -U pguser -d pgdb01
Password for user pguser: 
psql (11.1)
Type "help" for help.

pgdb01=> 

テーブル t1 に対して データを登録します。登録が正常に行われていることが確認できます。

pgdb01=> insert into t1 values(1,1);
INSERT 0 1
pgdb01=> 
pgdb01=> SELECT * FROM t1;
 c1 | c2 
----+----
  1 |  1
(1 row)

pgdb01=> 
pgdb01=> UPDATE t1 SET c1=10, c2=10 WHERE c1=1;
UPDATE 1
pgdb01=> 
pgdb01=> SELECT * FROM t1;
 c1 | c2 
----+----
 10 | 10
(1 row)

pgdb01=>