権限の追加

広告

作成したロールに権限の追加と削除する方法を確認していきます。スーパーユーザーと所有者(オブジェクトを作成したユーザ)はデフォルトで全ての権限を保持しているため、オブジェクトの所有者に権限を許可する必要はありません。それ以外のロールに対して権限を付与するには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 )