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