GRANT

Name

GRANT -- はアクセス権を定義します

Synopsis

GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }
  [,...] | ALL [ PRIVILEGES ] }
  ON tablename
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH GRANT OPTION ]

GRANT { { INSERT | UPDATE | REFERENCES } (column [, ...]) }
  [, ...]
  ON tablename
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH GRANT OPTION ]

GRANT { SELECT | ALL [ PRIVILEGES ] }
  ON sequencename
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
  ON FUNCTION progname
    ( [ [ argmode ] [ argname ] argtype ] [, ...] )
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
  ON PROCEDURE progname
    [ ( [ [ argmode ] [ argname ] argtype ] [, ...] ) ]
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
  ON PACKAGE packagename
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH GRANT OPTION ]

GRANT role [, ...]
  TO { username | groupname | PUBLIC } [, ...]
  [ WITH ADMIN OPTION ]

GRANT { CONNECT | RESOURCE | DBA } [, ...]
  TO { username | groupname } [, ...]
  [ WITH ADMIN OPTION ]

GRANT CREATE [ PUBLIC ] DATABASE LINK
  TO { username | groupname }

GRANT DROP PUBLIC DATABASE LINK
  TO { username | groupname }

GRANT EXEMPT ACCESS POLICY
  TO { username | groupname }

Description

GRANT コマンドには、データベースオブジェクト(テーブル、ビュー、シーケンス、またはプログラム)に対する権限を付与するもの、ロールのメンバーシップを付与するもの、システム権限を付与するものの3つの基本的な変形があります。これらのバリアントは多くの点で似ていますが、別々に説明するのに十分なほど異なっています。

AdvancedServerでは、ユーザーとグループの概念が role と呼ばれる単一のタイプのエンティティに統合されました。このコンテキストでは、 user は LOGIN 属性を持つロールです。このロールを使用して、セッションを作成し、アプリケーションに接続できます。 group は LOGIN 属性を持たないロールです。このロールは、セッションの作成やアプリケーションへの接続には使用できません。

ロールは1つ以上の他のロールのメンバーである場合があるため、グループに属するユーザーの従来の概念は引き続き有効です。ただし、ユーザーとグループの一般化により、ユーザーはユーザーに「所属」、グループはグループに「所属」、グループはユーザーに「所属」し、ロールの一般的なマルチレベル階層を形成できます。ユーザー名とグループ名は同じ名前空間を共有するため、 GRANT コマンドで被付与者がユーザーであるかグループであるかを区別する必要はありません。

データベースオブジェクトの付与

GRANT コマンドのこのバリアントは、データベースオブジェクトに対する特定の特権をロールに付与します。これらの特権は、すでに付与されているものがあれば、それらに追加されます。

キーワード PUBLIC は、後で作成されるロールを含むすべてのロールに特権が付与されることを示します。 PUBLIC は、すべてのロールを常に含む暗黙的に定義されたグループと考えることができます。特定のロールには、直接付与された特権、現在メンバーであるロールに付与された特権、および PUBLIC に付与された特権の合計があります。

WITH GRANT OPTION が指定されている場合、特権の受信者はそれを他の人に順番に付与できます。許可オプションがないと、受信者はそれを行うことができません。付与オプションは PUBLIC に付与できません。

所有者はデフォルトですべての特権を持っているため、オブジェクトの所有者(通常はオブジェクトを作成したユーザー)に特権を付与する必要はありません。(ただし、所有者は、安全のために自分の特権の一部を取り消すこともできます。)オブジェクトをドロップする権利または定義を変更する権利は、付与可能な特権では説明されません。それは所有者に固有のものであり、付与または取り消すことはできません。所有者には、オブジェクトに対するすべての付与オプションも暗黙的に含まれています。

オブジェクトのタイプに応じて、初期のデフォルト権限には PUBLIC への一部の権限の付与が含まれる場合があります。デフォルトは、テーブルへのパブリックアクセスなし、関数、プロシージャ、およびパッケージに対する EXECUTE 特権です。オブジェクトの所有者は、もちろんこれらの特権を取り消すことができます。(最大限のセキュリティを確保するには、オブジェクトを作成する同じトランザクションで REVOKE を発行します。そうすると、別のユーザーがオブジェクトを使用できるウィンドウがなくなります。)

可能な特権は次のとおりです。

SELECT

指定したテーブル、ビュー、またはシーケンスの任意の列から SELECT を許可します。シーケンスの場合、この特権は currval 機能の使用も許可します。

INSERT

指定したテーブルに新しい行の INSERT を許可します。

UPDATE

指定されたテーブルの列の UPDATE を許可します。 SELECT ... FOR UPDATE にはこの特権も必要です( SELECT 特権に加えて)。

DELETE

指定されたテーブルの行の DELETE を許可します。

REFERENCES

外部キー制約を作成するには、参照元テーブルと参照先テーブルの両方でこの権限が必要です。

EXECUTE

指定されたパッケージ、プロシージャ、または関数の使用を許可します。パッケージに適用すると、パッケージのすべてのパブリックプロシージャ、パブリック関数、パブリック変数、レコード、カーソル、その他のパブリックオブジェクトおよびオブジェクトタイプを使用できます。これは、関数、プロシージャ、およびパッケージに適用できる唯一の種類の特権です。

EXECUTE 特権を付与するAdvancedServer構文は、Oracleデータベースと完全に互換性がありません。AdvancedServerでは、キーワード FUNCTION 、 PROCEDURE 、または PACKAGE のいずれかでプログラム名を修飾する必要がありますが、これらのキーワードはOracleでは省略しなければなりません。関数の場合、AdvancedServerでは、関数名の後にすべての入力( IN 、 IN OUT )引数データ型が必要です(関数引数がない場合は空の括弧を含む)。プロシージャの場合、プロシージャに1つ以上の入力引数がある場合、すべての入力引数データ型を指定する必要があります。Oracleでは、関数とプロシージャの署名を省略する必要があります。これは、すべてのプログラムがOracleで同じ名前空間を共有するのに対し、関数、プロシージャ、およびパッケージはAdvancedServerで独自の名前空間を持ち、プログラム名をある程度オーバーロードできるためです。

ALL PRIVILEGES

使用可能なすべての特権を一度に付与します。

他のコマンドに必要な特権は、それぞれのコマンドのリファレンスページにリストされています。

ロールの付与

GRANT コマンドのこのバリアントは、ロールのメンバーシップを1つ以上の他のロールに付与します。ロールのメンバーシップは、ロールに付与された特権を各メンバーに伝えるため、重要です。

WITH ADMIN OPTION が指定されている場合、メンバーはそのロールのメンバーシップを他のユーザーに付与し、そのロールのメンバーシップも取り消すことができます。adminオプションがなければ、普通のユーザーはそれができません。

データベースのスーパーユーザーは、あらゆるロールのメンバーシップを誰にでも付与または取り消すことができます。 CREATEROLE 特権を持つロールは、スーパーユーザー以外のロールのメンバーシップを付与または取り消すことができます。

次の意味を持つ3つの定義済みロールがあります。

CONNECT

CONNECT ロールを付与することは、被付与者に LOGIN 特権を付与することと同等です。付与者には CREATEROLE 権限が必要です。

RESOURCE

RESOURCE ロールを付与することは、被付与者と同じ名前のスキーマに CREATE および USAGE 特権を付与することと同等です。このスキーマは、許可が付与される前に存在している必要があります。付与者は、このスキーマの CREATE または USAGE 特権を被付与者に付与する特権を持っている必要があります。

DBA

DBA ロールを付与することは、被付与者をスーパーユーザーにすることと同等です。付与者はスーパーユーザーでなければなりません。

Notes

REVOKE コマンドは、アクセス権限を取り消すために使用されます。

オブジェクトの非所有者がオブジェクトに対する GRANT 特権を試みると、ユーザーがオブジェクトに対する特権を持っていない場合、コマンドは完全に失敗します。特権が利用可能である限り、コマンドは続行しますが、ユーザーが許可オプションを持っている特権のみを許可します。 GRANT ALL PRIVILEGES フォームは、付与オプションが保持されていない場合に警告メッセージを発行し、他のフォームは、コマンドで明示的に指定された特権のいずれかの付与オプションが保持されていない場合に警告を発行します。(原則として、これらのステートメントはオブジェクト所有者にも適用されますが、所有者は常にすべての付与オプションを保持しているものとして扱われるため、ケースは発生しません。)

データベースのスーパーユーザーは、オブジェクト権限の設定に関係なく、すべてのオブジェクトにアクセスできることに注意してください。これは、Unixシステムの root の権利に匹敵します。 root と同様に、絶対に必要な場合を除き、スーパーユーザーとして操作することは賢明ではありません。

スーパーユーザーが GRANT または REVOKE コマンドを発行することを選択した場合、コマンドは、影響を受けるオブジェクトの所有者によって発行されたかのように実行されます。特に、このようなコマンドを介して付与された特権は、オブジェクトの所有者によって付与されたように見えます。(ロールメンバーシップの場合、メンバーシップは含まれるロール自体によって付与されたようです。)

GRANT および REVOKE は、影響を受けるオブジェクトの所有者ではないが、オブジェクトを所有するロールのメンバーであるロール、または特権 WITH GRANT OPTION を保持するロールのメンバーでも実行できますオブジェクト。この場合、特権は、オブジェクトを実際に所有するロールまたは特権 WITH GRANT OPTION を保持するロールによって付与されたものとして記録されます。

たとえば、テーブル t1 がロール g1 によって所有され、ロール u1 がメンバーである場合、 u1 は t1 に対する特権を u2 に付与できますが、それらの特権は g1 によって直接付与されます。役割 g1 の他のメンバーは、後でそれらを取り消すことができます。

GRANT を実行するロールが、複数のロールメンバーシップパスを介して間接的に必要な特権を保持している場合、どのロールが許可を行ったとして記録されるかは不明です。そのような場合は、 SET ROLE を使用して GRANT を実行する特定の役割になることがベストプラクティスです。

現在、AdvancedServerは、テーブルの個々の列に対する特権の付与または取り消しをサポートしていません。考えられる回避策の1つは、目的の列のみを持つビューを作成し、そのビューに特権を付与することです。

Examples

テーブル emp のすべてのユーザーに挿入特権を付与します。

GRANT INSERT ON emp TO PUBLIC;

ビュー salesemp のユーザー mary に使用可能なすべての特権を付与します。

GRANT ALL PRIVILEGES ON salesemp TO mary;

上記は実際にスーパーユーザーまたは emp の所有者によって実行された場合、すべての特権を付与しますが、他の誰かによって実行された場合、他の誰かが付与オプションを持っているパーミッションのみを付与します。

ユーザー joe にロール admins のメンバーシップを付与します。

GRANT admins TO joe;

ユーザー joe に CONNECT 権限を付与します。

GRANT CONNECT TO joe;

See Also

REVOKE、 SETROLE

システム権限の付与

GRANT コマンドのこのバリアントは、データベース内で特定の system 操作を実行する機能をロールに付与します。システム特権は、必ずしも1つのスキーマの範囲内にない特定のデータベースオブジェクトを作成または削除する機能に関連しています。データベースのスーパーユーザーのみがシステム権限を付与できます。

CREATE [PUBLIC] DATABASE LINK

CREATE [PUBLIC] DATABASE LINK 特権により、指定されたロールがデータベースリンクを作成できます。 PUBLIC キーワードを含めて、ロールがパブリックデータベースリンクを作成できるようにします。 PUBLIC キーワードを省略して、指定されたロールがプライベートデータベースリンクを作成できるようにします。

DROP PUBLIC DATABASE LINK

DROP PUBLIC DATABASE LINK 特権により、ロールはパブリックデータベースリンクを削除できます。プライベートデータベースリンクを削除するためにシステム権限は必要ありません。プライベートデータベースリンクは、リンク所有者またはデータベーススーパーユーザーによって削除される場合があります。

EXEMPT ACCESS POLICY

EXEMPT ACCESS POLICY 特権により、ロールは、ターゲットデータベースオブジェクトに関連付けられているポリシー関数を呼び出さずにSQLコマンドを実行できます。ロールは、データベース内のすべてのセキュリティポリシーから免除されます。

EXEMPT ACCESS POLICY 特権は、 EXEMPT ACCESS POLICY 特権を持つロールへのメンバーシップによって継承できません。たとえば、次の GRANT コマンドのシーケンスでは、 joe に EXEMPT ACCESS POLICY 特権が付与されている enterprisedb ロールのメンバーシップが joe に付与されていても、ユーザー joe は EXEMPT ACCESS POLICY 特権を取得しません:

GRANT EXEMPT ACCESS POLICY TO enterprisedb;
GRANT enterprisedb TO joe;

ロールに EXEMPT ACCESS POLICY 権限がある場合、システムカタログ表 pg_authid の rolpolicyexempt 列は true に設定されます。

Examples

ユーザー joe に CREATE PUBLIC DATABASE LINK 権限を付与します。

GRANT CREATE PUBLIC DATABASE LINK TO joe;

ユーザー joe に DROP PUBLIC DATABASE LINK 権限を付与します。

GRANT DROP PUBLIC DATABASE LINK TO joe;

ユーザー joe に EXEMPT ACCESS POLICY 権限を付与します。

GRANT EXEMPT ACCESS POLICY TO joe;

Using the ALTER ROLE Command to Assign System Privileges

AdvancedServerの ALTER ROLE コマンドは、次の割り当てに使用できる構文もサポートしています。

  • パブリックまたはプライベートのデータベースリンクを作成するために必要な特権。

  • パブリックデータベースリンクを削除するために必要な特権。

  • EXEMPT ACCESS POLICY 特権。

ALTER ROLE 構文は、Oracleデータベースと互換性のある各コマンドと機能的に同等です。

See Also

REVOKE、ALTERROLE