GRANT (表、ビュー、またはニックネーム特権) ステートメント
この形式の GRANT ステートメントは、表、ビュー、またはニックネームに対する特権を付与します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- 参照されている表、ビュー、またはニックネームに対する CONTROL 特権
- 指定したそれぞれの特権に対する WITH GRANT OPTION。 ALL を指定する場合、許可 ID は指定した表、ビュー、またはニックネームに対して何らかの付与可能な特権を持っている必要があります。
- 指定した表、ビュー、またはニックネームが含まれているスキーマに対する ACCESSCTRL 権限
- ACCESSCTRL または SECADM 権限
CONTROL 特権を付与するには、スキーマに対する ACCESSCTRL 権限、データベースに対する ACCESSCTRL 権限、または SECADM 権限が必要です。 カタログ表およびビューに対する特権を付与するためには、データベースに対する ACCESSCTRL 権限、または SECADM 権限が必要です。
構文
説明
- ALL または ALL PRIVILEGES
- ON 節で指定する基本表、ビュー、またはニックネームについて、
該当するすべての特権 (CONTROL を除く) を付与します。
ステートメントの許可 ID が表、ビュー、またはニックネームに対して CONTROL 特権を持っている場合、 あるいは ACCESSCTRL 権限または SECADM 権限を持っている場合には、 オブジェクトに適用できる特権のすべて (CONTROL を除く) が与えられます。 そうでない場合、与えられる特権は、ステートメントの許可 ID が指定の表、 ビュー、またはニックネームに対して持っているすべての付与可能な特権です。
ALL の指定がない場合、 特権のリストに示されているキーワードの 1 つまたは複数を指定する必要があります。
- ALTER
- 以下のことを行うための特権を付与します。
- 基本表の定義に列を追加する。
- 基本表の主キー制約またはユニーク制約を作成またはドロップする。
- 基本表の外部キーを作成またはドロップする。
親表の各列に対する REFERENCE 特権も必要になります。
- 基本表のチェック制約を作成またはドロップする。
- 基本表のトリガーを作成する。
- ニックネームの列オプションを追加、リセット、またはドロップする。
- ニックネームの列名またはデータ・タイプを変更する。
- 基本表、またはニックネームのコメントを追加または変更する。
- CONTROL
- 以下を付与します。
- リストに示されているすべての特権。
すなわち、
- 基本表に対する ALTER、CONTROL、DELETE、INSERT、INDEX、REFERENCE、SELECT、および UPDATE
- ビューに対する CONTROL、DELETE、INSERT、SELECT、および UPDATE
- ニックネームに対する ALTER、CONTROL、INDEX、および REFERENCE
- 他のユーザーに上記の特権 (CONTROL を除く) を付与する能力。
- 基本表、ビュー、またはニックネームをドロップする特権。
CONTROL 特権があっても、この特権を他のユーザーに拡張することはできません。 拡張するための唯一の方法は、CONTROL 特権を付与することであり、それは ACCESSCTRL または SECADM の権限を持つ許可 ID のみが行うことができます。
- 表と索引に対して RUNSTATS ユーティリティーを実行する特権。
- 表に対して REORG ユーティリティーを実行する特権。
- 基本表、マテリアライズ照会表、 またはステージング表に対して SET INTEGRITY ステートメントを発行する特権。
基本表、マテリアライズ照会表、ステージング表、 またはニックネームの定義者には、自動的に CONTROL 特権が付与されます。
ビューの定義者に全選択で指定されているすべての表、ビュー、 およびニックネームに対する CONTROL 特権が与えられている場合、 その定義者には自動的に CONTROL 特権が付与されます。
- リストに示されているすべての特権。
すなわち、
- DELETE
- 表または更新可能なビューから行を削除する特権を付与します。
- 索引
- 表の索引、またはニックネームの SPECIFICATION ONLY 指定の索引を作成する特権を付与します。 この特権は、ビューに対して付与することはできません。 索引または SPECIFICATION ONLY 指定の索引の作成者には、 その索引または SPECIFICATION ONLY 指定の索引に対する CONTROL 特権が自動的に与えられます (これにより、 作成者は索引または SPECIFICATION ONLY 指定の索引をドロップできます)。 さらに、INDEX 特権が取り消されても、作成者は CONTROL 特権をそのまま保持します。
- INSERT
- 表または更新可能なビューに行を挿入し、 IMPORT ユーティリティーを実行する特権を与えます。
- REFERENCES
- 親表を参照するための外部キーの作成やドロップを行う特権を付与します。ステートメントの許可 ID が以下のいずれかを持っている場合、
- ACCESSCTRL または SECADM 権限
- 表に対する CONTROL 特権
- 表に対する REFERENCES WITH GRANT OPTION
この特権はニックネームに付与することができますが、ニックネームを参照するために外部キーは定義できません。
- REFERENCES (column-name, ...)
- 列のリストに指定された列のみを親キーとして使用して外部キーを作成およびドロップする特権を与えます。 各 column-name (列名) は、 ON 節で指定される表の列を指定する非修飾名でなければなりません。 列レベルの REFERENCE 特権は、型付き表、型付きビュー、またはニックネームに対して付与できません (SQLSTATE 42997)。
- SELECT
- 以下のことを行うための特権を付与します。
- 表またはビューから行を検索する特権。
- 表にビューを作成する特権。
- 表またはビューに対して EXPORT ユーティリティーを実行する特権。
- UPDATE
- ON 節で指定される表または更新可能なビューに対して UPDATE ステートメントを使用する特権を付与します。ステートメントの許可 ID が以下のいずれかを持っている場合、
- ACCESSCTRL または SECADM 権限
- 表またはビューに対する CONTROL 特権
- その表またはビューに対する UPDATE WITH GRANT OPTION
- UPDATE (column-name, ...) (UPDATE (列名, ...))
- 列のリストに指定した列だけを、 UPDATE ステートメントを使用して更新する特権を付与します。 各 column-name は、 ON 節で指定される表またはビューの列を指定する非修飾名でなければなりません。 型付き表、型付きビュー、 またはニックネームに対する列レベルの UPDATE 特権は付与できません (SQLSTATE 42997)。
- ON TABLE table-name または view-name または nickname
- 特権を付与する表、ビュー、またはニックネームを指定します。
作動不能なビューまたは作動不能なマテリアライズ照会表に対する特権を付与することはできません (SQLSTATE 51024)。 宣言済み一時表に対する特権を付与することはできません (SQLSTATE 42995)。
- 今後
- 特権を誰に与えるかを指定します。
- ユーザー
- authorization-name がユーザーであることを指定します。
- GROUP
- authorization-name がグループ名であることを指定します。
- ROLE
- authorization-name がロール名であることを指定します。 ロール名は、現行サーバーに存在するものでなければなりません (SQLSTATE 42704)。
- 1 つ以上のユーザー、グループ、またはロールの許可 ID のリストを指定します。グループに付与された特権は、次のような許可検査では使用されません。
- パッケージ内の静的 DML ステートメントに対する許可検査
- CREATE VIEW ステートメントの処理過程での基本表に対する許可検査
- マテリアライズ照会表の CREATE TABLE ステートメントの処理過程での基本表に対する許可検査
グループに付与される表特権は、動的に準備されるステートメントにのみ適用されます。 例えば、PROJECT 表に対する INSERT 特権がグループ D204 に与えられ、 UBIQUITY (D204 のメンバー) には与えられていない場合、 UBIQUITY は以下のステートメントを出すことができます。
ここで、ストリングの内容は次のとおりです。EXEC SQL EXECUTE IMMEDIATE :INSERT_STRING;
ただし、以下のステートメントを含むプログラムをプリコンパイルまたはバインドすることはできません。INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP) VALUES ('AD3114', 'TOOL PROGRAMMING', 'D21', '000260');
EXEC SQL INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP) VALUES ('AD3114', 'TOOL PROGRAMMING', 'D21', '000260');
- PUBLIC
- 特権をユーザー (許可 ID) の集合に付与します。 詳細については、『
権限、特権、およびオブジェクト所有権
』を参照してください。 静的 SQL ステートメントおよび CREATE VIEW ステートメントに対して PUBLIC に与えられた特権の使用に関する、 以前の制約は除かれました。
- WITH GRANT OPTION
- 指定した authorization-name に対し、特権を他のユーザーに与えることを許可します。
指定した特権に CONTROL が含まれる場合、 WITH GRANT OPTION は CONTROL を除くすべての適用可能な特権に適用されます (SQLSTATE 01516)。
ルール
- 指定したそれぞれの authorization-name に関して、USER、GROUP、ROLE のいずれも指定されていない場合には、次のようになります。
- インスタンスに対して有効なセキュリティー・プラグインによって authorization-name の状況を判別できなければ、エラーが戻されます (SQLSTATE 56092)。
- authorization-name がデータベースでは ROLE として定義され、有効なセキュリティー・プラグインでは GROUP または USER のいずれかとして定義されている場合には、エラーが戻されます (SQLSTATE 56092)。
- 有効なセキュリティー・プラグインに従って authorization-name が USER と GROUP の両方として定義されている場合、エラーが戻されます (SQLSTATE 56092)。
- authorization-name が 有効なセキュリティー・プラグインに従って USER のみとして定義されている場合、または未定義の場合は、USER が想定されます。
- authorization-name が、 有効なセキュリティー・プラグインに従って GROUP としてのみ定義されている場合は、GROUP が想定されます。
- authorization-name がデータベースで ROLE としてのみ定義されている場合には、ROLE であると見なされます。
- 一般に、GRANT ステートメントはステートメントの許可 ID が与えることを許されている特権の GRANT のみを処理し、 1 つ以上の特権が与えられなかった場合は警告 (SQLSTATE 01007) を戻します。 どのような特権も与えられなかった場合は、エラーが戻されます (SQLSTATE 42501)。 ステートメントの処理に使用されるパッケージが、 LANGLEVEL を SQL92E または MIA に設定してプリコンパイルされていた場合、 付与者が GRANT 操作の対象に対して特権を持っていない場合以外は警告が戻されます (SQLSTATE 01007)。 CONTROL 特権を指定する場合、特権が与えられるのは、 ステートメントの許可 ID に ACCESSCTRL または SECADM 権限を持っているときだけです (SQLSTATE 42501)。
注
- 特権は、表階層の各レベルで別々に付与されます。 スーパー表に対する特権を持つユーザーは、その副表にも影響を及ぼす場合があります。 例えば、スーパー表 T に対する UPDATE 特権は持っているものの、 そのスーパー表の副表である S に対する UPDATE 特権は持っていないユーザーが T を指定して更新を要求すると、 T の副表 S 内にある行に対して変更を要求したかのようになる場合があります。 ユーザーが副表を直接操作できるのは、その副表に対して必要な特権を持っている場合だけです。
- ニックネーム特権を付与しても、 データ・ソース・オブジェクト (表またはビュー) の特権に与える影響はありません。 通常、データ・ソースの特権は、データの検索を試行する際、 ニックネームが参照する表またはビューで必要とされます。
- 代替構文: Db2® の以前のバージョンおよび他のデータベース製品との互換性のために、以下の代替の構文がサポートされています。 以下の構文は許容されますが、無視されます。
- PUBLIC AT ALL LOCATIONS
- 表またはビュー (CONTROL) 特権を付与するとき、WITH GRANT OPTION は無視されます。
例
- 表 WESTERN_CR に対するすべての特権を PUBLIC に与えます。
GRANT ALL ON WESTERN_CR TO PUBLIC
- ユーザー PHIL と CLAIRE が CALENDAR 表を読み取り、
また新しい項目を挿入することができるように、CALENDAR 表に対する適切な特権を付与します。 既存の項目の変更や削除を行うことは許可しません。
GRANT SELECT, INSERT ON CALENDAR TO USER PHIL, USER CLAIRE
- COUNCIL 表に対するすべての特権と、その特権を他のユーザーに適用する特権をユーザー FRANK に付与します。
GRANT ALL ON COUNCIL TO USER FRANK WITH GRANT OPTION
- 表 CORPDATA.EMPLOYEE に対する SELECT 特権を JOHN という名前のユーザーに付与します。 JOHN と呼ばれるユーザーは存在していますが、JOHN と呼ばれるグループは存在していません。
またはGRANT SELECT ON CORPDATA.EMPLOYEE TO JOHN
GRANT SELECT ON CORPDATA.EMPLOYEE TO USER JOHN
- 表 CORPDATA.EMPLOYEE に対する SELECT 特権を JOHN という名前のグループに付与します。 JOHN と呼ばれるグループは存在していますが、
JOHN と呼ばれるユーザーは存在していません。
またはGRANT SELECT ON CORPDATA.EMPLOYEE TO JOHN
GRANT SELECT ON CORPDATA.EMPLOYEE TO GROUP JOHN
- D024 という名前のグループと、D024 という名前のユーザーの両方に、
表 T1 に対する INSERT および SELECT 特権を付与します。
この場合、D024 グループのメンバーとユーザー D024 はいずれも、 表 T1 に対する INSERT と SELECT を使用できるようになります。 また、SYSCAT.TABAUTH カタログ・ビューには 2 つの行が追加されることになります。GRANT INSERT, SELECT ON TABLE T1 TO GROUP D024, USER D024
- ユーザー FRANK に、CALENDAR 表に対する INSERT、SELECT、および CONTROL 特権を付与します。 FRANK は特権を他のユーザーに渡すことが可能である必要があります。
このステートメントの結果、 CONTROL に WITH GRANT OPTION が与えられなかったことを示す警告 (SQLSTATE 01516) が出されます。 Frank は、INSERT と SELECT を含む CALENDAR に対する特権を必要に応じて付与することが可能になります。 FRANK は、ACCESSCTRL 権限または SECADM 権限を持っていない限り、 他のユーザーに CALENDAR に対する CONTROL 特権を付与することはできません。GRANT CONTROL ON TABLE CALENDAR TO FRANK WITH GRANT OPTION
- ユーザー JON が、索引のない Oracle 表のニックネームを作成しました。 ニックネームは ORAREM1 です。 その後、Oracle DBA がこの表の索引を定義しました。 そのため、ユーザー SHAWN は、
さらに効率よく表にアクセスするための戦略をオプティマイザーが立てられるようにするため、
この索引の存在を Db2 に認識させたいと思っています。 SHAWN は、 ORAREM1の索引仕様を作成することにより、 Db2 に索引を通知できます。 SHAWN が SPECIFICATION ONLY 指定の索引を作成できるようにするため、
このニックネームに対する索引特権を SHAWN に与えます。
GRANT INDEX ON NICKNAME ORAREM1 TO USER SHAWN