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