GRANT

名前

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 ([type, ...]) [, ...]
    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 コマンドは、オブジェクト (テーブル、ビュー、シーケンス、データベース、関数、手続き言語またはスキーマ) に関する特定の権限を、1 人以上のユーザあるいはユーザのグループに与えます。 すでに権限が他のユーザに付与されている場合でも、これに追加して付与されます。

PUBLIC キーワードは、今後作成されるユーザを含む、全てのユーザに許可されることを示します。 PUBLIC は全てのユーザを常に含む暗黙的に定義されたグループと考えることができます。 個々のユーザはすべて、ユーザに直接許可された権限、ユーザが現在属しているグループに許可された権限、そして、PUBLIC に許可された権限を合わせた権限を持っています。

WITH GRANT OPTIONが指定されると、権限受領者はその後、他のユーザにその権限を与えることができます。 デフォルトでは、これはできません。 グラントオプションは個々のユーザに対して与えることができ、グループやPUBLICには与えることができません。

所有者(通常はオブジェクトを作成したユーザ)はデフォルトですべての権限を保持するため、オブジェクトの所有者に権限を許可する必要はありません。 (ただし、作成者は安全性を確保するため自らの権限を取り消すことができます。) オブジェクトを削除する権限、あるいは付与可能な権限では記述できない何らかの方法でオブジェクトを変更する権利もまた所有者固有のものであり、これを許可または取り消すことはできません。 所有者のグラントオプションを取り消すこともできません。

WITH GRANT OPTIONが指定された場合、この権限をもらったユーザはその後他のユーザに許可することができます。 デフォルトではこれはできません。 グラントオプションは個々のユーザにのみ許可でき、グループやPUBLICには許可できません。

オブジェクトの種類によって、初期のデフォルト権限としていくつかの権限が PUBLIC に付与されていることがあります。 デフォルトでは、テーブルおよびスキーマに関する PUBLIC アクセス権限はなく、データベースの TEMP テーブルの作成権限、関数の EXECUTE 権限、および言語の USAGE 権限などです。 もちろんオブジェクトの作成者はこれらの権限を取り消すことができます。 (安全性を最大限に保つため、REVOKE コマンドはオブジェクトを作成した同じトランザクション内で発行してください。そうすれば、他のユーザによってそのオブジェクトが使用されてしまう時間はなくなります。)

設定可能な権限は以下のものです。

SELECT

指定したテーブル、ビュー、シーケンスの任意の列に対する SELECT を許可します。 また、COPY TO の使用も許可します。 シーケンスでは、この権限によっても currval 関数を使用することができます。

INSERT

指定したテーブルへの新規行の INSERT を許可します。 また、COPY FROM の使用も許可します。

UPDATE

指定したテーブルの任意の列に対する UPDATE を許可します。 SELECT ... FOR UPDATE もこの権限を必要とします (SELECT 権限の他に)。 シーケンスでは、この権限により nextval および setval の使用が許可されます。

DELETE

指定したテーブルからの行の DELETE を許可します。

RULE

テーブルまたはビュー上のルールの作成を許可します。 (CREATE RULE 文を参照して下さい。)

REFERENCES

外部キー制約を作成するには、参照する側と参照される側の両方でこの権限がなければなりません。

TRIGGER

指定したテーブル上のトリガの作成を許可します。 (CREATE TRIGGER 文を参照して下さい。)

CREATE

データベースでは、データベース内での新規スキーマの作成を許可します。

スキーマでは、スキーマ内での新規オブジェクトの作成を許可します。 既存のオブジェクトの名前変更を行うには、オブジェクトを所有しかつそのオブジェクトが入っているスキーマに対してこの権限を保持していなければなりません。

TEMPORARY
TEMP

データベースの使用中に一時テーブルを作成することを許可します。

EXECUTE

指定された関数、さらにその関数で実装されている任意の演算子の使用を許可します。 これは、関数に適用することができる唯一の権限です。 (この構文は集約関数についても同じように機能します)

USAGE

手続き言語において、関数の作成を指定した言語で行うことを許可します。 これは、手続き言語に適用することができる唯一の権限です。

スキーマにおいて、指定したスキーマに入っているオブジェクトへのアクセスを許可します (オブジェクト自体の権限要件が満たされている場合)。 基本的に、この権限によってスキーマ内のオブジェクトを"検索"する権限も確保されます。

ALL PRIVILEGES

オブジェクトに対して適用可能な権限すべてを一度に付与します。 PRIVILEGES キーワードは PostgreSQL では省略可能ですが、厳密な SQLでは必須なものです。

他のコマンドで必要となる権限は、そのコマンドのリファレンスページにて示されています。

注釈

アクセス権限を取り上げるには、REVOKEコマンドが使用されます。

データベーススーパーユーザのみが、オブジェクトに関する権限設定に関係なく、全てのオブジェクトにアクセスできることは注意しなければなりません。 これは、Unix システムにおける root 権限に似ています。 root と同様、絶対に必要な場合以外にはスーパーユーザとして操作を行わないのが賢明です。

スーパーユーザがGRANTREVOKEの発行を選択した場合、対象とするオブジェクトの所有者によって発行されたかのように、そのコマンドは実行されます。 特に、こうしたコマンドで与えられる権限は、オブジェクトの所有者によって与えられたものとして表されます。

現時点で、PostgreSQLで、一部の列にのみ権限を付与する方法は、対象とする列を持つビューを作成し、そのビューに対して権限を付与することです。

既存の権限についての情報を得るには、以下の例のように psql\z コマンドを使用して下さい。

=> \z mytable

        Access privileges for database "lusitania"
 Schema |  Table  |           Access privileges
--------+---------+---------------------------------------
 public | mytable | {=r/postgres,miriam=arwdRxt/postgres,"group todos=arw/postgres"}
(1 row)

\z で表される項目は、以下のように解釈することができます。

              =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 -- この権限を付与したユーザ

上記の例は、テーブル mytable の作成後、あるいは次のコマンドを実行した後にユーザ miriam に表示されます。

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO GROUP todos;

あるオブジェクトの"アクセス権限"列が空の場合、そのオブジェクトはデフォルトの権限を持っていることを意味します (つまり権限フィールドが NULL)。 所有者の場合は、デフォルト権限として常にすべての権限が含まれていますが、オブジェクトの種類によっては PUBLIC の権限も含まれることがあります。 これについてはすでに説明したとおりです。 オブジェクトでの最初の GRANT または REVOKE によってデフォルトの権限がインスタンス化されます (例えば {=,miriam=arwdRxt} が作成されます)、そして個別の要求によってこれらを変更します。

テーブル films にデータを追加する権限を全てのユーザに与えます。

GRANT INSERT ON films TO PUBLIC;

ビュー kinds の全ての権限を、ユーザ manuel に与えます。

GRANT ALL PRIVILEGES ON kinds TO manuel;

互換性

標準SQLに従い、ALL PRIVILEGES内の PRIVILEGESは必須です。標準SQL では、1つのコマンドによって、複数のオブジェクトに権限を設定することをサポートしていません。

標準SQLでは、テーブル中の個々の列に対して権限を設定することができます。

GRANT privileges
    ON table [ ( column [, ...] ) ] [, ...]
    TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ]

標準SQL では、文字セット, 集合, 翻訳, ドメインといった別種類のオブジェクトに対して、USAGE 権限を付与することができます。

RULE権限や、データベース、スキーマ、言語、シーケンスについての権限はPostgreSQLの拡張です。

関連項目

REVOKE