TimesTenには、データベース・オブジェクト(表、ビュー、マテリアライズド・ビュー、索引、順序、ファンクション、プロシージャ、パッケージなど)をオブジェクトレベルで分解することによる、データベース・アクセス制御の機能があります。TimesTenアクセス制御機能の基本的な情報については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のアクセス制御の管理に関する説明を参照してください。
この章では、PL/SQLユーザーに関連したアクセス制御について説明します。
|
注意: アクセス制御は、TimesTenをインストールすると有効になります。アクセス制御を無効にすることはできません。 |
この章の内容は次のとおりです。
この項の内容は次のとおりです。
PL/SQLユーザーの場合、アクセス制御はPL/SQLのプロシージャおよびファンクション(パッケージおよびそのメンバーのプロシージャとファンクションを含む)の作成、変更、削除または実行に影響します。
プロシージャ、ファンクション、パッケージ定義またはパッケージ本体をユーザー自身のスキーマに作成する場合は、CREATE PROCEDURE権限が必要であり、そのユーザー以外のスキーマに作成する場合はCREATE ANY PROCEDUREが必要です。プロシージャ、ファンクション、パッケージ定義、またはパッケージ本体を変更または削除するには、その所有者であるか、ALTER ANY PROCEDURE権限またはDROP ANY PROCEDURE権限をそれぞれ持っている必要があります。
プロシージャまたはファンクションを実行するには、その所有者であるか、そのプロシージャまたはファンクション(あるいは該当する場合はこれらが所属するパッケージ)に対するEXECUTE権限を持っているか、EXECUTE ANY PROCEDURE権限を持っている必要があります。これらを表7-1にまとめます。
表7-1 PL/SQLのプロシージャおよびファンクションを使用するための権限
| 操作 | SQL文または操作 | 必要な権限 |
|---|---|---|
|
プロシージャ、ファンクション、パッケージ定義またはパッケージ本体を作成します。 |
|
ユーザーのスキーマでの または 他のスキーマでの |
|
プロシージャ、ファンクションまたはパッケージを変更します。 |
|
プロシージャ、ファンクションまたはパッケージの所有権 または
|
|
プロシージャ、ファンクション、パッケージ定義またはパッケージ本体を削除します。 |
|
プロシージャ、ファンクションまたはパッケージの所有権 または
|
|
プロシージャまたはファンクションを実行します。 |
プロシージャまたはファンクションを起動します。 |
プロシージャまたはファンクション、あるいはこれらが所属するパッケージ(該当する場合)の所有権 または プロシージャまたはファンクション、あるいはこれらが属するパッケージ(該当する場合)に対する または
|
|
プロシージャ、ファンクション、またはパッケージのプライベート・シノニムを作成します。 |
|
ユーザーのスキーマでの または 他のスキーマでの |
|
プロシージャ、ファンクションまたはパッケージのパブリック・シノニムを作成します。 |
|
|
|
シノニムを使用してプロシージャまたはファンクションを実行します。 |
そのシノニムを使用してプロシージャまたはファンクションを起動します。 |
基になるプロシージャまたはファンクションを実行する権限 |
|
プロシージャ、ファンクションまたはパッケージのプライベート・シノニムを削除します。 |
|
シノニムの所有権 または
|
|
プロシージャ、ファンクションまたはパッケージのパブリック・シノニムを削除します。 |
|
|
この項で説明したSQL文の構文および必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。
権限を付与するには、SQL文GRANTを使用します。権限を取り消すには、REVOKEを使用します。
次の例では、user1が所有するプロシージャおよびパッケージに対するEXECUTE権限をuser2に付与します。
Command> grant execute on user1.myproc to user2; Command> grant execute on user1.mypkg to user2;
次の例では、この権限を取り消します。
Command> revoke execute on user1.myproc from user2; Command> revoke execute on user1.mypkg from user2;
例7-1 必要な権限の付与
この例は、ユーザーuser1によって試行される次の一連の操作を示しています。
ユーザーが、必要な権限を付与されていないときに各操作を試行します。その結果、エラーが表示されます。
インスタンス管理者が必要な権限を付与します。
ユーザーは操作の実行に成功します。
user1はttIsqlユーティリティを使用して操作を実行(または試行)し、インスタンス管理者はこのユーティリティを使用して権限を付与します。
USER1:
ユーザーは、最初はプロシージャを作成する権限を持っていません。ユーザー自身のスキーマであっても、付与される必要があります。
Command> create procedure testproc is
> begin
> dbms_output.put_line('user1.testproc called');
> end;
> /
15100: User USER1 lacks privilege CREATE PROCEDURE
The command failed.
インスタンス管理者:
Command> grant create procedure to user1;
USER1:
user1が自身のスキーマでプロシージャを作成できるようになると、プロシージャの所有者になるため、プロシージャの実行が可能になります。
Command> create procedure testproc is
> begin
> dbms_output.put_line('user1.testproc called');
> end;
> /
Procedure created.
Command> begin
> testproc();
> end;
> /
user1.testproc called
PL/SQL procedure successfully completed.
ただし、ユーザーは別のスキーマではまだプロシージャを作成できません。
Command> create procedure user2.testproc is
> begin
> dbms_output.put_line('user2.testproc called');
> end;
> /
15100: User USER1 lacks privilege CREATE ANY PROCEDURE
The command failed.
インスタンス管理者:
Command> grant create any procedure to user1;
USER1:
user1は別のスキーマでプロシージャを作成できるようになりましたが、スキーマを所有していないか、または権限を持っていないため、まだプロシージャを実行できません。
Command> create procedure user2.testproc is
> begin
> dbms_output.put_line('user2.testproc called');
> end;
> /
Procedure created.
Command> begin
> user2.testproc();
> end;
> /
8503: ORA-06550: line 2, column 7:
PLS-00904: insufficient privilege to access object USER2.TESTPROC
8503: ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
The command failed.
インスタンス管理者:
Command> grant execute any procedure to user1;
USER1:
user1は、別のスキーマでプロシージャを実行できるようになりました。
Command> begin
> user2.testproc();
> end;
> /
user2.testproc called
PL/SQL procedure successfully completed.
オブジェクトに対するユーザーの権限が取り消されると、そのオブジェクトを参照する、そのユーザーのすべてのPL/SQLオブジェクトが一時的に無効化されます。権限が元に戻されると、ユーザーはオブジェクトに対して適宜ALTER PROCEDURE、ALTER FUNCTIONまたはALTER PACKAGEを実行し、オブジェクトを明示的に再コンパイルおよび再検証できます。また、各オブジェクトは、次に実行されるときに自動的に再コンパイルおよび再検証されます。
たとえば、user1が、user2.proc1をコールするプロシージャuser1.proc0を所有している場合、user1のproc1に対するEXECUTE権限が取り消されると、proc0は無効になります。
次を使用して、無効になっているオブジェクトがないかを確認します。
select * from user_objects where status='INVALID';
ALTER文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。
例7-2 無効化されたオブジェクト
この例では、無効化されたオブジェクト(この例の場合はPL/SQLプロシージャ)を生成する次のようなシーケンスを示します。
ユーザーがCREATE ANY PROCEDURE権限を付与され、別のユーザーのスキーマにプロシージャを作成してから、その別のユーザーのスキーマにあるプロシージャをコールするプロシージャをユーザー自身のスキーマに作成します。
ユーザーが別のユーザーのスキーマでプロシージャを実行するEXECUTE権限を付与されます。
ユーザーが別のユーザーのスキーマでプロシージャをコールするプロシージャを自身のスキーマで実行します。
ユーザーから、別のユーザーのスキーマのプロシージャに対するEXECUTE権限が取り消され、そのユーザー自身のプロシージャが無効化されます。
ユーザーに、別のユーザーのスキーマのプロシージャに対するEXECUTE権限が再度付与されます。ユーザーが自身のプロシージャを実行すると、プロシージャは暗黙的に再コンパイルおよび再検証されます。
インスタンス管理者:
Command> grant create any procedure to user1;
USER1:
Command> create procedure user2.proc1 is
> begin
> dbms_output.put_line('user2.proc1 is called');
> end;
> /
Procedure created.
Command> create procedure user1.proc0 is
> begin
> dbms_output.put_line('user1.proc0 is called');
> user2.proc1;
> end;
> /
Procedure created.
インスタンス管理者:
Command> grant execute on user2.proc1 to user1;
USER1:
Command> begin
> user1.proc0;
> end;
> /
user1.proc0 is called
user2.proc1 is called
PL/SQL procedure successfully completed.
user1が無効なオブジェクトを持っていないことを確認するには、次のように実行します。
Command> select * from user_objects where status='INVALID'; 0 rows found.
インスタンス管理者:
ここで、user1のEXECUTE権限を取り消します。
Command> revoke execute on user2.proc1 from user1;
USER1:
user1にはuser2.proc1を実行する権限がなくなったため、即座にuser1.proc0は無効になります。
Command> select * from user_objects where status='INVALID'; < PROC0, <NULL>, 273, <NULL>, PROCEDURE, 2009-06-04 14:51:34, 2009-06-04 14:58:23, 2009-06-04:14:58:23, INVALID, N, N, N, 1, <NULL> > 1 row found.
このため、user1はプロシージャを実行できなくなりました。
Command> begin
> user1.proc0;
> end;
> /
8503: ORA-06550: line 2, column 7:
PLS-00905: object USER1.PROC0 is invalid
8503: ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
The command failed.
インスタンス管理者:
再度user2.proc1へのEXECUTE権限をuser1に付与します。
Command> grant execute on user2.proc1 to user1;
USER1:
プロシージャuser1.proc0は、明示的または暗黙的に再コンパイルされるまで無効のままです。次に示すとおり、実行時に暗黙的に再コンパイルされます。または、ALTER PROCEDUREを使用して明示的に再コンパイルすることができます。
Command> select * from user_objects where status='INVALID'; < PROC0, <NULL>, 273, <NULL>, PROCEDURE, 2009-06-04 14:51:34, 2009-06-04 16:13:00, 2009-06-04:16:13:00, INVALID, N, N, N, 1, <NULL> > 1 row found. Command> begin > user1.proc0; > end; > / user1.proc0 is called user2.proc1 is called PL/SQL procedure successfully completed. Command> select * from user_objects where status='INVALID'; 0 rows found.
無名ブロックで実行された問合せ、またはSQL DML文、あるいはEXECUTE IMMEDIATE文で実行されたSQL DDL文(このマニュアルで説明した操作、または例で使用した操作などすべて)では、ユーザーが、文を実行して必要なオブジェクトにアクセスする権限を持っていることを前提としています。PL/SQL無名ブロックで実行されるSQLには、直接実行した場合と同じ権限が必要です。たとえば、ユーザーが所有する表にデータ行を挿入する場合、権限は必要ありません。所有していない表にデータ行を挿入する場合は、その表に対するINSERT権限が付与されているか、またはINSERT ANY TABLEが付与されている必要があります。
SQL文およびその実行に必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。
PL/SQLのプロシージャまたはファンクションを定義するときに、CREATE FUNCTION文またはCREATE PROCEDURE文のオプションのAUTHID句で、プロシージャまたはファンクションを定義者権限(AUTHID DEFINER、デフォルト)で実行するか、実行者権限(AUTHID CURRENT_USER)で実行するかを指定します。同様に、パッケージ内のプロシージャまたはファンクションでは、CREATE PACKAGE文のAUTHID句で、パッケージのメンバーのファンクションまたはプロシージャそれぞれを定義者権限で実行するか、実行者権限で実行するかを指定します。AUTHID句の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明で、これらの文の構文に関する記述を参照してください。
AUTHIDの設定は、実行時にプロシージャまたはファンクションによって発行されるSQL文の名前解決および権限チェックに影響を与えます。定義者権限の場合、SQLの名前解決および権限チェックは、プロシージャまたはファンクションの所有者(定義者、つまりプロシージャまたはファンクションがあるスキーマの所有者)が実行しているものとして実行されます。実行者権限の場合、SQLの名前解決および権限チェックは、現在のユーザー(実行者)が実行しているものとして実行されます。
実行者権限は、コード本体に対しては広範囲な権限を付与する一方で、そのコードの影響範囲を各ユーザーのスキーマ内の自分のオブジェクトに限定する場合に役立ちます。
定義者権限は、すべてのユーザーが1つの集中管理された表またはその他のSQLオブジェクトにアクセスできるようにするものの、プロシージャによって実行される操作を特定の操作に制限する場合に役立ちます。それ以外の場合、ユーザーはSQLオブジェクトにはアクセスできません。
定義者権限および実行者権限の使用例は、「AUTHID句の使用例」を参照してください。
詳細は、『Oracle Database PL/SQL言語リファレンス』の実行者権限および定義者権限(AUTHIDプロパティ)に関する説明を参照してください。
この項の内容は次のとおりです。
データベースに接続する場合は、次の点に注意してください。
データベースに接続する権限は、CREATE SESSION権限によって、インスタンス管理者以外のすべてのユーザーに明示的に付与される必要があります。これはシステム権限であるため、インスタンス管理者またはADMIN権限を持つユーザーのいずれかによって、ユーザーに付与される必要があります。この権限付与は、直接またはPUBLICロールを介して実行できます。その他の情報および例は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のアクセス制御の管理に関する説明を参照してください。
PL/SQL接続属性に必要な権限の詳細は、「PL/SQL接続属性」を参照してください。
システム・ビューおよびPL/SQL提供パッケージへのアクセスについては、次の点に注意してください。
様々なシステム表、システム・ビュー、PL/SQLファンクション、PL/SQLプロシージャ、およびPL/SQLパッケージに対するSELECT権限およびEXECUTE権限は、デフォルトで、すべてのユーザーがメンバーとばっているPUBLICロールを介して、すべてのユーザーに付与されています。このロールの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』の権限に関する説明を参照してください。これらのパブリック・データベース・オブジェクトおよび関連する権限のリストを表示するには、次のコマンドを使用します。
SELECT table_name, privilege FROM sys.all_tab_privs WHERE grantee='PUBLIC';
すべてのユーザーがALL_*システム・ビューおよびUSER_*システム・ビューに対するSELECT権限を持っています。
EXECUTE ANY PROCEDUREは提供パッケージには適用されませんが、そのほとんどはPUBLICロールを介してアクセス可能です。TimesTenで提供されるPL/SQLパッケージのアクセス制御の詳細は、第8章「TimesTenが提供するPL/SQLパッケージ」を参照してください。
ライブラリ・キャッシュのパフォーマンスおよびアクティビティに関する統計を返すttPLSQLMemoryStats組込みプロシージャは、どのユーザーでもコールできます。このプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttPLSQLMemoryStatsに関する説明を参照してください。例 6-3も参照してください。