GRANT

Name

GRANT -- アクセス権限の定義

Synopsis

GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION funcname ([type, ...]) [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE langname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schemaname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...]

説明

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

PUBLIC キーワードは、今後作成されるユーザを含む、全てのユーザに許可されることを示します。PUBLIC は全てのユーザを常に含む暗黙的に定義されたグループと考えることができます。個々のユーザはすべて、ユーザに直接許可された権限、ユーザが現在属しているグループに許可された権限、そして、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 と同様、絶対に必要な場合以外にはスーパーユーザとして操作を行わないのが賢明です。

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

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

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

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

              =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 -- すべての権限 (テーブル用)

上記の例は、テーブル 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;

互換性

SQL92

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

SQL92 の構文では、GRANT はテーブル中の個々の列に対して権限を設定すること、そして権限を与えられたユーザが同じ権限を他のユーザに与えることを許可しています。

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

SQL では、CHARACTER SET, COLLATION, TRANSLATION, DOMAINといった別種類のオブジェクトに対して、USAGE 権限を付与することができます。

TRIGGER権限は SQL99 にて導入されました。RULE 権限は PostgreSQL の拡張です。

関連項目

REVOKE