JavaServer Pages
同じクラスの 2 つの定義 つの定義 つの定義 つの定義
■ 必要なデータベース権限およびJVMのパーミッション
■ JARファイルまたはZIPファイルのロード
クラスにロードした後、データベース・スキーマでUSER_OBJECTSビューにアクセスして、
クラスおよびリソースが正しくロードされたことを確認できます。 詳細は、2-27ページの
「Javaアップロードのチェック」を参照してください。
同じクラスの 同じクラスの 同じクラスの
同じクラスの 2 つの定義 つの定義 つの定義 つの定義
同じクラスに2つの異なる定義を指定することはできません。この規則により、次のような 2つの制限を受けることになります。
■ 特定の.classファイルか、その.javaファイルのどちらか一方をロードできますが、
両方はロードできません。
Oracle8i JVMはクラス・ファイルまたはソース・ファイルのどちらがロードされたかを
追跡します。クラスを更新するには、先にロードしたのと同じタイプのファイルをロー ドする必要があります。他のタイプを更新するには、最初にロードしたタイプのファイ .properties Javaリソース・ファイ
ル
1. 別のスキーマが指定された場合を除き、定義者のス キーマの中にリソース・スキーマ・オブジェクトを 作成します。
2. スキーマ・オブジェクトにリソース・ファイルを ロードします。
.ser SQLJプロファイル 1. 別のスキーマが指定された場合を除き、定義者のス
キーマの中にリソース・スキーマ・オブジェクトを 作成します。
2. .serリソース・ファイルをスキーマ・オブジェクト に格納してカスタマイズします。
注意 注意注意
注意: loadjavaには他にもオプションがあります。しかし、ここでは 主なオプションのみを取り上げます。loadjavaとdropjavaの詳細は、
『Oracle8i Java Tools リファレンス』を参照してください。
Javaクラス・メソッドの実行準備
ルを削除してから次のタイプのファイルをロードする必要があります。たとえば、クラ スyのソースとしてx.javaをロードしてある場合に、x.classをロードするには、
まずx.javaを削除する必要があります。
■ 1つのスキーマ内の異なる2つのスキーマ・オブジェクトに、同じクラスを定義するこ とはできません。たとえば、x.javaでクラスyを定義し、yの定義をz.javaに移動 しようとします。x.javaがすでにロードされている場合は、loadjavaによって z.javaのロードが拒否されます。これは、z.javaにもyが定義されているためです。
かわりに、次のどちらかの方法で操作する必要があります。
■ x.javaを削除し、(yが定義されている)z.javaをロードします。次に新しい(y が定義されていない)x.javaをロードします。
■ 新しい(yが定義されていない)x.javaをロードします。次に(yが定義されてい る)z.javaをロードします。
必要なデータベース権限および 必要なデータベース権限および 必要なデータベース権限および
必要なデータベース権限および JVM のパーミッション のパーミッション のパーミッション のパーミッション
クラスをロードするには、次のようなSQLデータベース権限が必要です。
■ スキーマにロードするためのCREATEPROCEDUREおよびCREATE TABLE権限
■ 別のスキーマにロードするためのCREATEANYPROCEDUREおよびCREATE ANY TABLE 権限
■ oracle.aurora.security.Oracle8i JVMPermission.loadLibraryInClass.<classname>。詳細 は、5-25ページの「クラスをロードするためのパーミッション」を参照してください。
JAR ファイルまたは ファイルまたは ファイルまたは ファイルまたは ZIP ファイルのロード ファイルのロード ファイルのロード ファイルのロード
loadjavaツールは.class、.java、.properties、 .sqlj、.ser、.jar、または.zip ファイルをアクセプトします。JARファイルまたはZIPファイルにはソース、クラスおよび データ・ファイルが含まれます。loadjavaにJARファイルまたはZIPファイルを渡すと、
loadjavaはアーカイブをオープンして、そのメンバーを個別にロードします。JARまたは ZIPのスキーマ・オブジェクトはありません。JARファイルまたはZIPファイルの内容が前 回のロード時から変更されていない場合は、再ロードはされません。したがって、JARファ イルまたはZIPファイルのロードによるパフォーマンス低下はほとんどありません。実際、
loadjavaを使用するには、JARファイルまたはZIPファイルをロードするのが最も簡単な 方法です。
Javaクラス・メソッドの実行準備
実行権限を付与する方法 実行権限を付与する方法 実行権限を付与する方法 実行権限を付与する方法
クラスをロードするときには、loadjavaのオプションを使用して別のユーザーに実行権限 を付与することができます。クラスを実行できるユーザーを定義するには、2つの方法があ ります。
■ 特定のユーザーまたはスキーマに実行権限を付与する方法
Javaアプリケーションを定義したクラスは、その所有者のSQLスキーマにある、
Oracle8iのRDBMSに格納されます。デフォルトでは、特定のユーザーのスキーマに格
納されたクラスは、セキュリティ保護の観点から、他のユーザーからは実行できませ ん。loadjava -grantオプションを使用して、自分のクラスの実行権限を他のユー ザー(スキーマ)に与えることができます。
■ クラスの実行権限の付与対象として評価するユーザーまたはスキーマを指定する方法 実行権限の付与対象として評価されるユーザーを実行者または定義者のどちらかに指定 できます。実行者権限と定義者権限は、Javaクラスに適用できるSQLの概念です。
SQLでは、定義者権限で実行する場合には、PL/SQLをロードしたスキーマのユーザー 認証を使用して実行します。実行者権限の場合には、実際にPL/SQLを起動するスキー マのユーザー認証を使用してSQLを実行します。これはJavaクラスにも適用されます が、JVMセキュリティのパーミッションにより、Javaクラス内における実行者と評価 されるスキーマは、そのクラスが実行者権限でロードされたのか、定義者権限でロード されたのかに依存します。
図 図図
図2-2 実行者権限と定義者権限実行者権限と定義者権限実行者権限と定義者権限実行者権限と定義者権限
図2-2の例の場合、クラスCのメソッドを実行するときにクラスAまたはBのどちら がチェックされるのでしょうか?これは実行者権限または定義者権限によって決まりま す。
注意 注意注意
注意: 前回のロード時から変更がない場合、Oracle8i JVMはクラスを再 ロードしません。ただし、loadjava -forceオプションを使用すると強 制的にクラスを再ロードできます。
クラスA クラスB クラスC
メソッドの起動:クラスAがクラスBを起動し、クラスBがクラスCを起動します。
クラスの実行権限:
*クラスAにはクラスBに対する実行権限があります。
*クラスAにはクラスCに対する実行権限はありません。
*クラスBにはクラスCに対する実行権限があります。
Javaクラス・メソッドの実行準備
* 実行者権限 − デフォルトでは、クラスCのメソッドを最初に起動したクライ アントのスキーマの有効な認証と権限でクラスが実行されます。この場合は、
クラスAの権限がチェックされます。クラスAはクラスCに対する実行権限 を持っていないので、要求は拒否されます。これがデフォルト設定です。
* 定義者権限 − クラスは、そのクラスをロードしたユーザーの有効な認証で実 行します。クラスBをロードした際に定義者権限を指定した場合、クラスCの メソッドが起動されるとクラスBがチェックされます。クラスBはクラスC のメソッドに対する実行権限を持っているので、メソッドは正常に完了しま す。クラスBは、loadjava-definerを実行して定義者権限でロードされて います。
JVMセキュリティのパーミッションの詳細は、第6章「Oracle8i Javaアプリケーションの パフォーマンス」を参照してください。
Java アップロードのチェック アップロードのチェック アップロードのチェック アップロードのチェック
USER_OBJECTSデータベース・ビューに問合せをして、Javaソース、クラスおよびリソー スを含め、自分が所有するリソースなどのスキーマ・オブジェクトに関する情報を得ること ができます。たとえば、ロードしたソース、クラスまたはリソースが正しくスキーマ・オブ ジェクトに格納されているかどうかを確認できます。
USER_OBJECTSの列には、次の表2-2に示す項目が含まれています。
オブジェクト名とタイプ オブジェクト名とタイプ オブジェクト名とタイプ オブジェクト名とタイプ
USER_OBJECTSのOBJECT_NAMEは、短縮名です。31文字を超える名前は短縮名で格納さ
れます。 完全名と短縮名の詳細は、2-30ページの「クラスの短縮名」を参照してください。
サーバーでスキーマ・オブジェクトの短縮名を使用する場合、短縮名形式や変換規則を知ら なくても、サーバーのDBMS_JAVAパッケージのLONGNAME()ルーチンを使用して、問合 せをすることにより名前を完全名形式で受け取ることができます。
SQL*Plus> SELECT dbms_java.longname(object_name) FROM user_objects WHERE object_type='JAVA SOURCE';
表表表
表2-2 主な主な主な主なUSER_OBJECT列列列列 名前
名前名前
名前 説明説明説明説明
OBJECT_NAME オブジェクトの名前
OBJECT_TYPE オブジェクトのタイプ(JAVA SOURCE、JAVA CLASSまたはJAVA
RESOURCEなど)
STATUS オブジェクトの状態(VALIDまたはINVALID)(JAVA RESOURCEに
ついては常にVALID)