代码之家  ›  专栏  ›  技术社区  ›  Leigh Riffel

Oracle数据库使用Java删除文件

  •  0
  • Leigh Riffel  · 技术社区  · 17 年前

    本周末某个时候,我们的一个数据库(11.1.0.7)开始出现问题,无法通过Java访问部分网络上的某些文件夹。我使用java的一小部分复制了这个问题,它只创建一个file对象并尝试删除该文件。从 该数据库可用于删除\zion\dp\share上的本地文件和网络文件,但不能从\zion\it\share中删除。

    我们有另一个在同一域用户帐户下运行的数据库,从该位置删除文件时没有问题。也作为服务器上的同一个域用户登录,有问题我可以在Oracle之外运行java,删除时没有问题 文件夹。域用户可以完全控制文件夹,并以我可以创建、修改和删除文件的用户身份登录。

    如果我没有授予我的oracle数据库用户适当的dbms_java权限,我会得到相应的java.security.AccessControlException错误。在我授予java运行完成的权限之后,delete命令返回false(NothingDeleted),并且文件不会被删除。

    我打开了一个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) };
          }
       }
    }
    
    5 回复  |  直到 17 年前
        1
  •  0
  •   APC    17 年前

    从数据库内部针对操作系统运行的命令作为 oracle 账户因此,您需要在\zion\it上授予读写权限\ 在操作系统级别 到

    删除文件是你真正想做的吗?还是只是一个测试?因为我们可以使用PL/SQL过程删除文件 UTL_FILE.FREMOVE()

        2
  •  0
  •   Red    17 年前

    如果您具有oracle管理员权限,请在oracle侦听器列表下检查您的远程服务器(其他域服务器)主机名和端口是否可用??(使用Oracle Netmanager)并检查listener.ora文件。。

        3
  •  0
  •   Gary Myers    17 年前

    “但创建文件对象并尝试删除该文件” 您能否确定删除是否失败,因为 文件名有点奇怪 可能有什么东西在关注该共享(复制、备份、病毒扫描) c) 权限不足

        4
  •  0
  •   Gary Myers    17 年前

    事实上,它在某些情况下起作用可能是“运气”,而不是记录在案的行为。

    path 而不是文件看起来更像一个失败将是更多的信息。

        5
  •  0
  •   Leigh Riffel    17 年前

    Oracle支持人员建议在执行删除/存在操作时查看Oracle可执行文件上运行的Process Monitor的结果后重新启动服务器。他们发现这一行动的结果是 STATUS_USER_SESSION_DELETED (0xC0000203)