]説明GRANTには基本的に2つの種類があります。1つはデータベースオブジェクト(テーブル、列、ビュー、外部テーブル、シーケンス、データベース、外部データラッパ、外部サーバ、関数、手続き言語、スキーマ、テーブル空間)に対する権限の付与、もう1つはロール内のメンバ資格の付与です。これらの種類は多くの点で似ていますが、説明は別々に行わなければならない程違いがあります。データベースオブジェクトに対するGRANTこの種類のGRANTコマンドはデータベースオブジェクトの特定の権限を1つ以上のロールに付与します。権限が他のロールに付与されている場合でも、追加として付与されます。1つ以上のスキーマ内の同じ種類のオブジェクトすべてに対して権限を付与するオプションも存在します。この機能は現在テーブル、シーケンス、関数のみでサポートされます。TABLESにはビューおよび外部テーブルが含まれるとみなされていることに注意してください。)PUBLICキーワードは、今後作成されるロールを含む、全てのロールへの許可を示します。PUBLICは、全てのロールを常に含む、暗黙的に定義されたグループと考えることができます。個々のロールは全て、ロールに直接許可された権限、ロールが現在属しているロールに許可された権限、そして、PUBLICに許可された権限を合わせた権限を持っています。OPTIONが指定されると、権限の受領者は、その後、他にその権限を与えることができます。グラントオプションがない場合、受領者はこれを行うことができません。グラントオプションはPUBLICには与えることができません。(ただし、オブジェクトの作成者が、安全性のために自らの権限を取り消すことは可能です)。オブジェクトを削除する権限や何らかの方法でオブジェクトの定義を変更する権限は、付与可能な権限として扱われません。これらの権限は、所有者固有のものであり、許可したり取り消したりすることはできません。(しかし、オブジェクトを所有するロール内のメンバ関係を付与したり取り消すことで、同等な効果を得ることができます。所有者は、オブジェクトに対する全てのグラントオプションも暗黙的に保持しています。PostgreSQLは、一部の種類のオブジェクトに対し、デフォルトの権限をPUBLICに付与します。デフォルトでは、テーブル、列、スキーマ、テーブル空間に関してPUBLICに与えられるアクセス権限はありません。他の種類のオブジェクトでは、PUBLICに与えられる権限は次の通りです。TABLE権限、関数ではEXECUTE権限、言語ではUSAGE権限です。オブジェクトの所有者はデフォルトで与えられた権限と明示的に与えられた権限の両方をREVOKEすることができます。(最大限の安全性を得るには、オブジェクトを作成したトランザクションと同じトランザクション内でREVOKEコマンドを発行してください。すれば、他のユーザがそのオブジェクトを使用できる隙間はなくなります)。PRIVILEGESコマンドを使用して変更可能です。設定可能な権限は以下のものです。SELECT指定したテーブル、ビュー、シーケンスの任意の列あるいは指定した列リストに対するSELECTを許可します。TOの使用も許可します。存在する列の値をUPDATEやDELETEで参照するためにも、この権限は必要です。シーケンスでは、この権限によってcurrval関数を使用することができます。ラージオブジェクトでは、この権限によってオブジェクトを読み取ることができます。INSERT指定したテーブルへの新規の行のINSERTを許可します。列リストが指定された場合は、これらの列のみをINSERTコマンド内で設定することができます(従って、その他の列はデフォルト値となります)。FROMの使用も許可します。UPDATE指定したテーブルの任意の列あるいは指定した列リストに対するUPDATEを許可します。(実際には、単純ではないUPDATEコマンドはすべて、SELECT権限を同様に必要とします。どの行を更新すべきかを決めるため、または、列の新しい値を計算するため、またはその両方のため、テーブル列を参照する必要があるからです。SHAREも、SELECT権限に加えて、少なくとも1つの列に対するこの権限を必要とします。シーケンスでは、この権限によりnextvalおよびsetval関数の使用が許可されます。ラージオブジェクトでは、この権限によりオブジェクトの書き出しや切り詰めを行うことができます。DELETE指定したテーブルからの行のDELETEを許可します。(実際には、単純ではないDELETEコマンドはすべて、SELECT権限を同様に必要とします。どの行を削除すべきかを決めるためにテーブルの列を参照する必要があるからです。)TRUNCATE指定したテーブルに対してTRUNCATEを行うことができます。REFERENCES外部キー制約を作成するには、参照する側と参照される側の両方の列に対して、この権限を持っていなければなりません。この権限はテーブルのすべての列に付与することも、特定の列のみに付与することもできます。TRIGGER文を参照してください)。CREATE対象がデータベースの場合は、データベース内での新規スキーマの作成を許可します。対象がスキーマの場合は、スキーマ内での新規オブジェクトの作成を許可します。既存のオブジェクトの名前を変更するには、オブジェクトを所有し、かつ、そのオブジェクトが入っているスキーマに対してこの権限を保持していなければなりません。(この権限の取り消しによって既存のデータベースやスキーマの配置が変わることはないことに注意してください)。CONNECTユーザは指定されたデータベースに接続することができます。この権限は(pg_hba.confで組み込まれる制限の検査に加え)接続開始時に検査されます。TEMPORARYTEMP指定したデータベースの使用中に一時テーブルを作成することを許可します。EXECUTE指定された関数、さらにその関数で実装されている任意の演算子の使用を許可します。(この構文は集約関数についても同じように機能します)。USAGE対象が手続き言語の場合、その言語で関数を作成することを許可します。これは、手続き言語に適用することができる唯一の権限です。対象がスキーマの場合、指定したスキーマに含まれるオブジェクトへのアクセスを許可します(オブジェクト自体の権限要件も満たされている必要があります)。本質的には、この権限によってスキーマ内のオブジェクトを"検索"する権限が認められます。この権限がなくても、例えばシステムテーブルを問い合わせることでオブジェクト名を知ることは可能です。この権限を取り消した後でも、存在し続けているバックエンドがこうした検索を以前に実行していた文を持っている可能性があります。このため、これはオブジェクトへのアクセスを防ぐ、完全に安全な方法ではありません。対象がシーケンスの場合、この権限はcurrvalおよびnextval関数の使用を許可します。対象が型あるいはドメインの場合、この権限により、テーブル、関数、その他のスキーマオブジェクトの作成の際に、この型またはドメインを使用できるようになります。(問い合わせにおけるその型の値に対する操作など、一般的な型の"使用"を制御するものではないことに注意してください。その型に依存したオブジェクトが作成されることを防止するだけです。この権限の主な目的は、どのユーザが型に依存するものを作成するかを制御することです。そのようなオブジェクトが作成されると、所有者がその型を後で変更できなくなるかもしれないからです。)対象が外部データラッパの場合、この権限を与えられると外部データラッパを使用する新しいサーバを作成することができます。対象がサーバの場合、この権限を与えられると、サーバを使用する外部テーブルの作成を行うことができ、サーバと関連し自身が所有するユーザのユーザマップを作成、変更、削除を行うことができます。PRIVILEGES利用可能な全ての権限を一度に付与します。PRIVILEGESキーワードはPostgreSQLでは省略可能ですが、厳密なSQLでは必須です。その他のコマンドの実行に必要な権限は、そのコマンドのリファレンスページにて示されています。ロールに対するGRANTこの種類のGRANTコマンドは、ロール内のメンバ資格を1つ以上の他のロールに付与します。これによりロールに付与された権限が各メンバに与えられるので、ロール内のメンバ資格は重要です。OPTIONが指定された場合、メンバはロール内のメンバ資格を他に付与することができるようになります。同様にロール内のメンバ資格を取り消すこともできるようになります。アドミンオプションがないと、一般ユーザは他への権限の付与や取り消しを行うことができません。OPTIONを保持しているとはみなされませんが、データベースセッションのユーザがロールにマッチする場合について、ロール内のメンバ資格を付与あるいは取り消しを行うことができます。データベーススーパーユーザはすべてのロール内のメンバ資格を誰にでも付与したり、取り消したりすることができます。CREATEROLE権限を持つロールは、スーパーユーザロール以外の任意のロール内のメンバ資格の付与、取り上げが可能です。権限の場合と異なり、ロール内のメンバ資格をPUBLICに付与することはできません。このコマンド構文では無意味なGROUPという単語を受け付けないことに注意してください。注釈アクセス権限を取り消すには、REVOKEコマンドが使用されます。8.1から、ユーザとグループという概念は、ロールと呼ばれる1種類の実体に統合されました。そのため、付与者がユーザかグループかどうかを識別するためにGROUPキーワードを使用する必要はなくなりました。このコマンドではまだGROUPを使うことはできますが、何の意味もありません。ユーザは特定の列あるいはテーブル全体に対する権限を持つ場合にSELECT、INSERTなどを実行することができます。テーブルレベルの権限を付与してからある列に対する権限を取り消しても、望むことは実現できません。テーブルレベルの権限は列レベルの操作による影響を受けないからです。オブジェクトの所有者でもなく、そのオブジェクトに何の権限も持たないユーザが、そのオブジェクトの権限をGRANTしようとしても、コマンドの実行は直ちに失敗します。何らかの権限を持っている限り、コマンドの実行は進行しますが、与えることのできる権限は、そのユーザがグラントオプションを持つ権限のみです。PRIVILEGES構文は警告メッセージを発します。(原理上、ここまでの説明はオブジェクトの所有者に対しても当てはまりますが、所有者は常に全てのグラントオプションを保持しているものとして扱われるため、こうした状態は決して起こりません)。データベーススーパーユーザは、オブジェクトに関する権限設定に関係なく、全てのオブジェクトにアクセスできることには注意しなければなりません。スーパーユーザが持つ権限は、Unixシステムにおけるroot権限に似ています。rootと同様、どうしても必要という場合以外は、スーパーユーザとして操作を行わないのが賢明です。スーパーユーザがGRANTやREVOKEの発行を選択した場合、それらのコマンドは対象とするオブジェクトの所有者が発行したかのように実行されます。したコマンドで与えられる権限は、オブジェクトの所有者によって与えられたものとして表されます。(ロールのメンバ資格では、メンバ資格は含まれるロール自身が与えたものとして表されます。OPTION権限を持つロールのメンバでなければなりません。OPTION権限を持つロールによって付与されたものとして記録されます。テーブルt1がロールg1によって所有され、ロールu1がロールg1のメンバであるとします。この場合、u1はt1に関する権限をu2に付与できます。これらの権限はg1によって直接付与されたものとして現れます。後でロールg1の他のメンバがこの権限を取り消すことができます。どのロールが権限を付与したロールとして記録されるかについては指定されません。ROLEを使用して、GRANTを行わせたい特定のロールになることを推奨します。テーブルへの権限付与によって、SERIAL列によって関連付けされたシーケンスを含め、そのテーブルで使用されるシーケンスへの権限の拡張は自動的に行われません。シーケンスへの権限は別途設定しなければなりません。既存のテーブルおよび列に対する権限についての情報を得るには、以下の例のようにpsqlの\dpコマンドを使用してください。row)\dpで表される項目は、以下のように解釈することができます。他のオブジェクトでは異なります。この権限を付与したロール上記の例は、mytableテーブルを作成し、次のコマンドを実行した後にmiriamユーザに表示されます。miriam_rw;テーブル以外のオブジェクトでは、その権限を表示することができる他の\dコマンドがあります。あるオブジェクトの"アクセス権限"列が空の場合、そのオブジェクトはデフォルトの権限を持っていることを意味します(つまり権限フィールドがNULL)。所有者に対しては、デフォルト権限として常に全ての権限が含まれていますが、オブジェクトの種類によっては、PUBLICの権限が含まれていることがあります。これについては既に説明した通りです。オブジェクトに対する最初のGRANTまたはREVOKEが実行されるとデフォルトの権限がインスタンス化され(例えば{miriam=arwdDxt/miriam}のように作成されます)、与えられた要求によってこれらを変更します。同様に、デフォルト以外の権限を持つ列に対してのみ"列アクセス権限"内で項目が表示されます。この目的のために、"デフォルト権限"とはそのオブジェクト種類の組み込みのデフォルト権限を意味します。PRIVILEGESコマンドにより影響をうける権限を持つオブジェクトは常に、このALTERによる影響を含め、明示的な権限項目を持って表示されます。)所有者が暗黙のうちに持つグラントオプションは、上記のアクセス権限の表示に出力されていない点に注目してください。*は、グラントオプションが明示的に誰かに与えられた場合にのみ出力されます。例テーブルfilmsにデータを追加する権限を全てのユーザに与えます。PUBLIC;ビューkindsにおける利用可能な全ての権限を、ユーザmanuelに与えます。manuel;上のコマンドをスーパーユーザやkindsの所有者が実行した場合は、全ての権限が付与されますが、他のユーザが実行した場合は、そのユーザがグラントオプションを持つ権限のみが付与されることに注意してください。ロールadmins内のメンバ資格をユーザjoeに与えます。PRIVILEGES内のPRIVILEGESキーワードは必須です。標準SQLでは、1つのコマンドで複数のオブジェクトに権限を設定することはサポートしていません。PostgreSQLでは、オブジェクトの所有者は、自身が持つ権限を取り消すことができます。テーブル所有者は自身のINSERT、UPDATE、DELETE、TRUNCATE権限を取り消すことで、自分にとってそのテーブルが読み取り専用になるよう変更することができます。これは、標準SQLでは不可能です。PostgreSQLでは、所有者の権限を、所有者自身により与えられたものとして扱っているため、同様に所有者自身で権限を取り消すことができるようになっています。標準SQLでは、所有者の権限は仮想的なエンティティ"_SYSTEM"によって与えられたものとして扱っています。所有者は"_SYSTEM"ではないため、その権限を取り消すことができません。標準SQLにしたがうと、グラントオプションはPUBLICに対して与えることができます。PostgreSQLではグラントオプションはロールに対して与えることのみをサポートしています。標準SQLでは、文字セット、照合順序、翻訳といったその他の種類のオブジェクトに対して、USAGE権限を付与することができます。標準SQLでは、シーケンスはUSAGE権限のみを持ちます。FOR式の使用を制御するものです。シーケンスに関するSELECT権限とUPDATE権限はPostgreSQLの拡張です。シーケンスに関するUSAGE権限がcurrval関数にも適用される点もPostgreSQLの拡張です(この関数自体が拡張です)。データベース、テーブル空間、スキーマ、言語についての権限はPostgreSQLの拡張です。