- 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 )