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
システム権限の付与¶
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