今週末のある時点で、データベースの 1 つ (11.1.0.7) で、Java を介してネットワークの一部にある特定のフォルダーにアクセスする際に問題が発生し始めました。ファイルオブジェクトを作成してファイルを削除しようとするだけの Java のごく一部を使用して、問題を再現しました。データベースからは、\zion\dp\ 共有のローカル ファイルとネットワーク ファイルの削除には機能しますが、\zion\it\ 共有からは機能しません。
この場所からファイルを削除しても問題のない同じドメイン ユーザー アカウントで実行される別のデータベースがあります。問題のあるサーバーに同じドメインユーザーとしてログインしても、Oracleの外部でJavaを実行でき、ファイルの削除に問題はありません。ドメイン ユーザーはフォルダーを完全に制御でき、ファイルを作成、変更、および削除できるユーザーとしてログインします。
Oracle データベース ユーザーに適切な dbms_java 権限を付与していない場合、適切な java.security.AccessControlException エラーが発生します。Java が完了するまで実行する権限を付与した後、delete コマンドは false (何も削除されていない) を返し、ファイルは削除されません。
Oracle にケースをオープンしましたが、Oracle 環境からしか再現できないにもかかわらず、Java レイヤーからファイル コマンドを実行する必要があるため、これ以上役に立たないようです。
テストコード:
import java.io.*;
import java.sql.*;
import java.util.*;
public class Ajclass
{
public static void ajprocedure(String pdfFileName) throws Exception
{
boolean result;
try {
System.out.println("Start!");
File file = new File(pdfFileName);
//result = file.delete();
result = file.exists();
if (result == true)
System.out.println("xxFile deleted.");
else
System.out.println("xxFile NOT deleted!");
System.out.println("End!");
} catch ( Exception e ) {
throw(e);
}
}
}
私が最近見つけた他のコードは、この共有に対してのみ失敗し、このデータベース内から実行された場合にのみ失敗します。
import java.io.*;
import java.sql.*;
public class DirectoryListing
{
public static void getList(String directory) throws SQLException
{
File path = new File( directory );
String[] list = path.list();
String element;
int CurrentFile;
for(CurrentFile = 0; CurrentFile < list.length; CurrentFile++)
{
element = list[CurrentFile];
#sql { INSERT INTO DIRECTORYLISTING (FILENAME) VALUES (:element) };
}
}
}