本周末的某个时候,我们的一个数据库 (11.1.0.7) 开始在通过 Java 访问部分网络上的某些文件夹时遇到问题。我已经使用一小部分java重现了这个问题,除了创建一个文件对象并尝试删除文件之外什么都不做。这适用于从数据库中删除本地文件和删除我们 \zion\dp\ 共享上的本地文件和网络文件,但不能从我们的 \zion\it\ 共享中删除。
我们有另一个在同一域用户帐户下运行的数据库,从该位置删除文件没有问题。还以服务器上的同一域用户身份登录,但我可以在 Oracle 之外运行 java,并且在删除文件时没有问题。域用户可以完全控制文件夹并以我可以创建、修改和删除文件的用户身份登录。
如果我没有授予我的 oracle 数据库用户适当的 dbms_java 权限,我会收到适当的 java.security.AccessControlException 错误。在我授予 java 运行完成的权限后,删除命令返回 false(未删除任何内容)并且文件没有被删除。
我用 Oracle 打开了一个案例,但看起来它们不再有帮助,因为它涉及从 java 层运行的文件命令,即使它只能从 Oracle 环境中重现。
测试代码:
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) };
}
}
}