PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 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 { CREATE | ALL [ PRIVILEGES ] }
        ON TABLESPACE tablespacename [, ...]
        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コマンドが使用されます。

オブジェクトに権限を持っていない、オブジェクトの所有者以外のユーザがそのオブジェクトに権限を`GRANT`しようとすると、そのコマンドは失敗します。 何らかの権限が利用できる限り、コマンドは進行しますが、そのユーザがグラントオプションを持つ権限のみを与えることができます。 グラントオプションを持っていない場合、`GRANT ALL PRIVILEGES`形式は警告メッセージを発します。 一方、他の形式では、コマンドで名前を指定した権限に関するグラントオプションを持っていない場合に警告メッセージを発します。 （原理上、ここまでの説明はオブジェクトの所有者に対しても当てはまりますが、所有者は常に全てのグラントオプションを保持しているものとして扱われますので、こうした状態は決して起こりません。）

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

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

現時点ではPostgreSQLはテーブルの個別の列に対して権限を付与したり取り消したりすることができません。 回避策は、対象とする列を持つビューを作成し、そのビューに対して権限を付与することです。

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

    => \z mytable

            Access privileges for database "lusitania"
     Schema |  Name   | Type  |                     Access privileges
    --------+---------+-------+------------------------------------------------------------
     public | mytable | table | {miriam=arwdRxt/miriam,=r/miriam,"group todos=arw/miriam"}
    (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/miriam}`が作成されます)、そして、個別の要求によってこれらを変更します。

所有者の暗黙的なグラントオプションがこのアクセス権限の表示上に出力されていない点に注目してください。 `*`は、グラントオプションが明示的にだれかに与えられた場合にのみ出力されます。

## 例

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

    GRANT INSERT ON films TO PUBLIC;

`kinds`ビューの利用可能な全ての権限を、`manuel`ユーザに与えます。

    GRANT ALL PRIVILEGES ON kinds TO manuel;

上のコマンドをスーパーユーザや`kinds`の所有者が実行した場合は、全ての権限が付与され、他のユーザが実行した場合は、そのユーザがグラントオプションを持つ権限のみが付与されることに注意してください。

## 互換性

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

PostgreSQLでは、オブジェクトの所有者は、自身が持つ権限を取り上げることができます。 例えば、テーブル所有者は自身のINSERT、UPDATEおよびDELETE権限を取り上げることでそのテーブルを所有者から読み取りのみに変更することができます。 これは、標準SQLに従っていません。 PostgreSQLでは、所有者の権限を、所有者自身により与えられたものとして扱っているため、同様に権限を取り上げることができるようになっています。 標準SQLでは、所有者の権限は仮想的な"_SYSTEM"実体によって与えられたものとしています。 そのため、所有者はその権限を取り上げることができません。

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

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

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

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

## 関連項目

REVOKE

前のページ | ホーム | 次のページ
FETCH | 上に戻る | INSERT