- Home ›
- PostgreSQLの使い方 ›
- ロール(ユーザー)の作成 ›
- HERE
権限の追加
作成したロールに権限の追加と削除する方法を確認していきます。スーパーユーザーと所有者(オブジェクトを作成したユーザ)はデフォルトで全ての権限を保持しているため、オブジェクトの所有者に権限を許可する必要はありません。それ以外のロールに対して権限を付与するにはGRANTを使います。
GRANT {{SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER}
[,...] | ALL [PRIVILEGES]}
ON [TABLE] tablename [, ...]
TO {username | GROUP groupname | PUBLIC} [, ...] [WITH GRANT OPTION]
GRANT {{CREATE | TEMPORARY | TEMP} [,...] | ALL [PRIVILEGES]}
ON DATABASE dbname [, ...]
TO {username | GROUP groupname | PUBLIC } [, ...] [WITH GRANT OPTION]
GRANT {EXECUTE | ALL [PRIVILEGES]}
ON FUNCTION funcname ([[argmode] [argname] argtype [, ...]]) [, ...]
TO {username | GROUP groupname | PUBLIC} [, ...] [WITH GRANT OPTION]
GRANT {USAGE | ALL [PRIVILEGES]}
ON LANGUAGE langname [, ...]
TO {username | GROUP groupname | PUBLIC} [, ...] [WITH GRANT OPTION]
GRANT {{CREATE | USAGE} [,...] | ALL [PRIVILEGES]}
ON SCHEMA schemaname [, ...]
TO {username | GROUP groupname | PUBLIC} [, ...] [WITH GRANT OPTION]
GRANT {CREATE | ALL [PRIVILEGES]}
ON TABLESPACE tablespacename [, ...]
TO {username | GROUP groupname | PUBLIC} [, ...] [WITH GRANT OPTION]
GRANT role [, ...]
TO {username | GROUP groupname | PUBLIC} [, ...] [WITH ADMIN OPTION]
色々ありますが、基本は下記の通りです。
GRANT 権限 ON 対象 TO 誰に
「与える権限」にはSELECTやINSERTなどテーブルに対する権限や、CREATEなどデータベースに対するものがあります。また「対象」はテーブル名やデータベース名になります。「誰に」はユーザーとしてのロールやグループとしてのロールの他にPUBLICがあります。PUBLICは全てのロールが含まれますので、PUBLICに対して権限を与えると全てのロールに権限を与えたことになります。
また「WITH GRANT OPTION」を付けて権限を付与された場合、与えられたロールは同じ権限を別のロールに付与することが出来るようになります。(PUBLICには付けることができません)。
実際の例としては下記のような感じです。
GRANT SELECT, UPDATE, INSERT ON table_name TO role_name;
権限の追加と確認のテスト
では試してみましょう。「sample」データベース内にある「test」テーブルに対して、「testrole」ロールにSELECT、UPDATE、INSERT、DELETEの権限を与えてみます。現在の権限の状況を見るにはpsqlから「¥z」で確認できます。
現時点ではどのロールにも何も権限は付与されていません。このような場合、所有者に権限があるものも表示されません。
では権限を与えてみます。
権限を与えた後に確認すると下記のように表示されます。
sample=# ¥z
Access privileges for database "sample"
Schema | Name | Type | Access privileges
--------+------+-------+----------------------------------------------------
public | test | table | {postgres=arwdRxt/postgres,testrole=arwd/postgres}
(1 row)
sample=#
「Access privileges」に権限の状態が表示されています。「ロール名=権限/権限を与えたロール」の形で表示されます。この場合でも所有者がデフォルトで持つ権限は表示されません。
各記号の意味は下記の通りです。
=xxxx -- PUBLICに与えられた権限
uname=xxxx -- 1人のユーザに与えられた権限
group gname=xxxx -- グループに与えられた権限
r -- SELECT(読み取り(read))
w -- UPDATE(書き込み(write))
a -- INSERT (追加(append))
d -- DELETE
R -- RULE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
T -- TEMPORARY
arwdRxt -- 全ての権限(テーブル用)
* -- 直前の権限に関するグラントオプション
/yyyy -- この権限を付与したユーザ
よって、「testrole=arwd/postgres」の意味は、「testrole」ロールに対して「postgres」ユーザーが「SELECT / UPDATE / INSERT / DALETE」の権限が与えれた、ということになります。また「postgres=arwdRxt/postgres」は「postgres」ロールが「全ての権限(テーブル用)」を持っていることになります。
( Written by Tatsuo Ikura )
DBOnline