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権限を持っている必要があります。 これらの全体について、表8-1にまとめます。
重要: CREATE ANY PROCEDURE権限およびEXECUTE ANY PROCEDURE権限を付与する場合は、注意してください。 これらの権限は、特に相互を組み合せた場合に誤用される可能性があります。 |
表8-1 PL/SQLのプロシージャおよびファンクションを使用するための権限
操作 | SQL文または操作 | 必要な権限 |
---|---|---|
プロシージャ、ファンクション、パッケージ定義またはパッケージ本体を作成します。 |
CREATE [OR REPLACE] PROCEDURE CREATE [OR REPLACE] FUNCTION CREATE [OR REPLACE] PACKAGE CREATE [OR REPLACE] PACKAGE BODY |
ユーザーのスキーマでのCREATE PROCEDURE または ユーザー以外のスキーマでのCREATE ANY PROCEDURE |
プロシージャ、ファンクションまたはパッケージを変更します。 |
ALTER PROCEDURE ALTER FUNCTION ALTER PACKAGE |
プロシージャ、ファンクションまたはパッケージの所有権 または ALTER ANY PROCEDURE |
プロシージャ、ファンクション、パッケージ定義またはパッケージ本体を削除します。 |
DROP PROCEDURE DROP FUNCTION DROP PACKAGE DROP PACKAGE BODY |
プロシージャ、ファンクションまたはパッケージの所有権 または DROP ANY PROCEDURE |
プロシージャまたはファンクションを実行します。 |
プロシージャまたはファンクションを起動します。 |
プロシージャまたはファンクション、あるいはこれらが所属するパッケージ(該当する場合)の所有権 または プロシージャまたはファンクション、あるいはこれらが所属するパッケージ(該当する場合)に対するEXECUTE または EXECUTE ANY PROCEDURE |
この項で説明した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;
例8-1 必要な権限の付与
この例は、ユーザーuser1
によって試行される次の一連の操作を示しています。
ユーザーが、必要な権限を付与されていないときに各操作を試行します。 その結果、エラーが表示されます。
インスタンス管理者が必要な権限を付与します。
ユーザーは操作の実行に成功します。
user1
はttIsql
ユーティリティを使用して操作を実行(または試行)し、インスタンス管理者はこのユーティリティを使用して権限を付与します。
ユーザー1:
ユーザーは、最初はプロシージャを作成する権限を持っていません。 プロシージャの作成権限は、ユーザー自身のスキーマであっても、付与される必要があります。
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;
ユーザー1:
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;
ユーザー1:
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;
ユーザー1:
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文に関する説明を参照してください。
例8-2 無効化されたオブジェクト
この例では、無効化されたオブジェクト(この例の場合はPL/SQLプロシージャ)を生成する次のようなシーケンスを示します。
ユーザーがCREATE ANY PROCEDURE権限を付与され、別のユーザーのスキーマでプロシージャを作成してから、その別のユーザーのスキーマにあるプロシージャをコールするプロシージャをユーザー自身のスキーマで作成します。
ユーザーが別のユーザーのスキーマでプロシージャを実行するEXECUTE権限を付与されます。
ユーザーが別のユーザーのスキーマでプロシージャをコールするプロシージャを自身のスキーマで実行します。
ユーザーから、別のユーザーのスキーマのプロシージャに対するEXECUTE権限が取り消され、そのユーザー自身のプロシージャが無効化されます。
ユーザーに、別のユーザーのスキーマのプロシージャに対するEXECUTE権限が再度付与されます。 ユーザーが自身のプロシージャを実行すると、プロシージャは暗黙的に再コンパイルおよび再検証されます。
インスタンス管理者:
Command> grant create any procedure to user1;
ユーザー1:
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;
ユーザー1:
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;
ユーザー1:
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; > end003B > / 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;
ユーザー1:
プロシージャ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句)の使用に関する説明を参照してください。
この項の内容は次のとおりです。
データベースに接続する場合は、次の点に注意してください。
TimesTenデータ・ストアに接続する権限は、CREATE SESSION権限によって、インスタンス管理者以外のすべてのユーザーに明示的に付与する必要があります。 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パッケージのアクセス制御の詳細は、「TimesTenが提供するPL/SQLパッケージ」を参照してください。
ライブラリ・キャッシュのパフォーマンスおよびアクティビティに関する統計を返すttPLSQLMemoryStats
組込みプロシージャは、どのユーザーでもコールできます。 このプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttPLSQLMemoryStatsに関する説明を参照してください。 例7-4「PL/SQLパフォーマンス統計情報の表示」も参照してください。