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を許可します。 また、COPY TOの使用も許可します。 シーケンスでは、また、この権限によってcurrval関数を使用することができます。
指定したテーブルの任意の列に対するUPDATEを許可します。 SELECT ... FOR UPDATEも(SELECT権限の他に)この権限を必要とします。 シーケンスでは、この権限によりnextvalおよびsetvalの使用が許可されます。
指定したテーブルからの行のDELETEを許可します。
テーブルまたはビュー上のルールの作成を許可します。 (CREATE RULE文を参照してください。)
外部キー制約を作成するには、参照する側と参照される側の両方でこの権限がなければなりません。
指定したテーブル上のトリガの作成を許可します。 (CREATE TRIGGER文を参照してください。)
データベースでは、データベース内での新規スキーマの作成を許可します。
スキーマでは、スキーマ内での新規オブジェクトの作成を許可します。 既存のオブジェクトの名前変更を行うには、オブジェクトを所有し、かつ、そのオブジェクトが入っているスキーマに対してこの権限を保持していなければなりません。
テーブル空間では、テーブル空間内でのテーブルとインデックス作成を許可し、また、デフォルトのテーブル空間としてこのテーブル空間を持つデータベースの作成を許可します。 (この権限の取り消しにより既存のデータベースやスキーマの振舞いが変わることがないことに注意してください。)
データベースの使用中に一時テーブルを作成することを許可します。
指定された関数、更にその関数で実装されている任意の演算子の使用を許可します。 これは、関数に適用することができる唯一の権限です。 (この構文は集約関数についても同じように機能します。)
手続き言語において、関数の作成を指定した言語で行うことを許可します。 これは、手続き言語に適用することができる唯一の権限です。
スキーマにおいて、指定したスキーマに入っているオブジェクトへのアクセスを許可します(オブジェクト自体の権限要件が満たされている場合)。 基本的に、この権限によってスキーマ内のオブジェクトを"検索"する権限も確保されます。
利用可能な権限全てを一度に付与します。 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の拡張です。