Stored Procedure で host command #3 Tweet
前回からの続きです。
さて、前回は、javaクラスをOracle Databaseへデプロイしたところまでだった。
ということで、デプロイしたクラスとメソッドを確認しておきましょう! (以下の例は、 user_java_methodsビューを問い合わせたもの)
このマニュアルも参考になるのでリンクしておきます。
SQL> conn scott/tiger
SQL> select name,method_name,accessibility,is_static,return_class from user_java_methods;
NAME METHOD_NAM ACCESSIBILITY IS_STA RETURN_CLA
---------------------------------------- ---------- ------------------ ------ ----------
jp/macdeoracle/CommandOutputReader $init$ NO -
jp/macdeoracle/CommandOutputReader <init> PUBLIC NO -
jp/macdeoracle/CommandOutputReader run PUBLIC NO -
jp/macdeoracle/HostCommandExecuter <clinit> YES -
jp/macdeoracle/HostCommandExecuter exec PRIVATE YES -
jp/macdeoracle/HostCommandExecuter ls PUBLIC YES -
jp/macdeoracle/HostCommandExecuter main PUBLIC YES -
jp/macdeoracle/HostCommandExecuter <init> PUBLIC NO -
8行が選択されました。
SQL>
● 次にjavaストアドプロシージャのコール仕様を作成する
language java以降がポイントですよ。実行するstatic methodを指定します。
SQL> create or replace procedure ls(directory IN VARCHAR2)
2 as language java
3 name 'jp.macdeoracle.HostCommandExecuter.ls(java.lang.String)';
4 /
プロシージャが作成されました。
では、実行してみると・・・・・。
あれれ、権限が足りないとでますね。。。。。
SQL>
SQL> exec ls('c:¥temp');
BEGIN ls; END;
*
行1でエラーが発生しました。:
ORA-29532: 不明なJava例外でJavaコールが終了しました: java.security.AccessControlException: the Permission (java.io.FilePermission <<ALL
FILES>> execute) has not been granted to SCOTT. The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' )
ORA-06512: "SCOTT.LS", 行1
ORA-06512: 行1
● エラーメッセージの指示通りに、 dbms_java.grant_permissionを実行してみることに。。
user_java_policyを確認してみると権限は付与されたようですね。。。
SQL> conn / as sysdba
SQL> execute dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission','<<ALL FILES>>','execute');
PL/SQLプロシージャが正常に完了しました。
SQL>
SQL> conn scott/tiger
SQL> select action,type_name,name,enabled from user_java_policy;
ACTION TYPE_NAME NAME ENABLED
---------- ---------------------------------------- ---------------------------------------- ----------------
read java.io.FilePermission <<ALL FILES>> ENABLED
java.lang.RuntimePermission accessClassInPackage.* ENABLED
java.lang.RuntimePermission defineClassInPackage.* ENABLED
java.lang.RuntimePermission getProtectionDomain ENABLED
java.lang.RuntimePermission stopThread ENABLED
connect, java.net.SocketPermission * ENABLED
resolve
java.lang.RuntimePermission createSecurityManager ENABLED
java.lang.RuntimePermission exitVM ENABLED
java.lang.RuntimePermission loadLibrary.* ENABLED
java.lang.RuntimePermission modifyThread ENABLED
java.lang.RuntimePermission modifyThreadGroup ENABLED
java.lang.RuntimePermission preferences ENABLED
read java.util.PropertyPermission * ENABLED
write java.util.PropertyPermission user.language ENABLED
oracle.aurora.rdbms.security.PolicyTable 0:java.lang.RuntimePermission#loadLibrar ENABLED
Permission y.*
oracle.aurora.security.JServerPermission DUMMY DISABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.java.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.oracle.aurora.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.oracle.jdbc.* ENABLED
execute java.io.FilePermission <<ALL FILES>> ENABLED
21行が選択されました。
SQL>
再度、実行してます!
SQL> exec ls('c:¥temp');
BEGIN ls; END;
*
行1でエラーが発生しました。:
ORA-29532: 不明なJava例外でJavaコールが終了しました: java.security.AccessControlException: the Permission (java.io.FilePermission <<ALL
FILES>> execute) has not been granted to SCOTT. The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' )
ORA-06512: "SCOTT.LS", 行1
ORA-06512: 行1
なんなんでしょうね。よくわからないエラーメッセージですね。権限はあるのに。
わかりにくいメッセージ。やはりこうでなくちゃ、オラクルは。。なんてね。
イライラしてきたので、javasysprivロールを付与しちゃいました。(セキュリティ面からみれば好ましくないのですけど。)
各クラス毎に実行権限を細かく付与すればうまくいきそうですが、エラーメッセージからは、何のどんな権限が不足しているのか単純には判断できない(予想はつきますけど・・・)ので、この件に関しては別途調べることにして先へ進むことにします。要調査->TODO
SQL> conn / as sysdba
接続されました。
SQL> grant javasyspriv to scott;
権限付与が成功しました。
:-) やっと動いた〜。
SQL> conn scott/tiger
接続されました。
SQL>
SQL> set serveroutput on
SQL> exec dbms_java.set_output(2000);
PL/SQLプロシージャが正常に完了しました。
SQL> exec ls('c:¥temp');
apex_3.0
apex_3.0.zip
jdevstudio10131.zip
version.log
PL/SQLプロシージャが正常に完了しました。
SQL>
なんとか実行できました。。。ね。 (^^;;;;
| 固定リンク | 0
コメント