سؤال

وفي وقت ما في نهاية هذا الاسبوع واحدة من قواعد البيانات لدينا (11.1.0.7) بدأت تواجه مشاكل في الوصول إلى بعض المجلدات على جزء من الشبكة من خلال جافا. لقد استنسخ المشكلة باستخدام جزء صغير من القهوة أن لا يفعل شيئا ولكن إنشاء كائن الملف ومحاولة حذف الملف. من قاعدة البيانات هذه يعمل لحذف الملفات المحلية وحذف ملفات الشبكة على \ موانئ دبي \ حصة \ صهيون لدينا، ولكن ليس من وجهة نظرنا \ صهيون \ أنه \ سهم.

لدينا قاعدة بيانات أخرى أن يعمل تحت مستخدمي المجال نفس الحساب الذي لا يوجد لديه مشاكل حذف الملفات من هذا الموقع. كما دخولك كمستخدم نفس المجال على مشاكل الخادم وجود يمكنني تشغيل جافا خارج أوراكل وليس لديهم مشاكل حذف الملفات. مستخدم المجال ديه السيطرة الكاملة على المجلد وتسجيل الدخول باسم المستخدم يمكنني إنشاء وتعديل وحذف الملفات.

إذا أنا لم تمنح لي مستخدم قاعدة البيانات أوراكل الأذونات المناسبة dbms_java أحصل على خطأ java.security.AccessControlException المناسب. بعد أن منح الإذن تشغيل جافا على الانتهاء، يعود الأمر حذف كاذبة (أي شيء حذف) ولا يتم حذف الملف.

وفتحت الحال مع أوراكل، ولكن يبدو أنها لن تساعد أي أكثر لأنه ينطوي على أوامر ملف تدار من طبقة جافا على الرغم من أنها غير قابلة للتكرار فقط من بيئة أوراكل.

واختبار الرمز:

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

اقترح دعم

وأوراكل إعادة تشغيل الملقم بعد النظر في نتائج عملية مراقبة تدار على تنفيذ أوراكل في حين أن حذف / وجود عملية تجري. ووجد الباحثون أن العمل يحصل على نتيجة STATUS_USER_SESSION_DELETED (0xC0000203) من الملقم البعيد، وهو ما يعني التواصل بين الملقم المحلي والبعيد لا تعمل بشكل صحيح على مستوى النوافذ. ونحن نخطط لإعادة تشغيل في نهاية هذا الاسبوع لمعرفة ما إذا كان هذا سيؤدي إلى حل المشكلة.

نصائح أخرى

وأوامر تشغيل ضد OS من داخل قاعدة البيانات تشغيل كحساب oracle. لذلك تحتاج إلى منحة القراءة والكتابة على \ صهيون \ أنه \ <م> على مستوى OS إلى oracle فضلا عن منح أذونات جافا داخل قاعدة البيانات.

هل حذف الملفات ما كنت فعلا تريد أن تفعل؟ أم أنها مجرد اختبار؟ لأننا لا نستطيع حذف الملفات باستخدام الإجراء PL / SQL <لأ href = "http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/u_file.htm#sthref14641" يختلط = "نوفولو noreferrer" > UTL_FILE.FREMOVE () .

إذا كان لديك أذونات أوراكل المشرف، التحقق من بعيد الخادم (غير نطاق الخادم) اسم المضيف وميناء متوفرة تحت قائمة المستمعين أوراكل ؟؟ (باستخدام أوراكل Netmanager)، وكذلك التحقق من listener.ora ملف ..

و"لكن إنشاء كائن الملف ومحاولة حذف ملف" يمكنك تحديد ما إذا كان فشل حذف ل أ) لا يمكن العثور على الملف شيء غريب في اسم الملف ب) تم تأمين ملف / فتح من قبل عملية أخرى قد يكون هناك شيء تبحث في ذلك حصة (التكرار والنسخ الاحتياطي ومسح الفيروسات) ج) إذن غير كافية

ما هي أنظمة الملفات الأساسية؟

وماذا عن نشر جزء كود بأكملها. وتشير منتدى آخر أنك قد لا تكون قادرا على استخدام نفس filehandle. واضاف "لكن سأكون على استعداد للمراهنة على أن تحاول حذف ملف على اساس" مقبض "متغير من FileOutputStream إذا كان هذا هو الحال، لا يمكنك، فأنت بحاجة إلى إنشاء كائن الملف باستخدام اسم ملف يستخدم عند إنشاء FileOutputStream، ثم حذف () ذلك ".

والحقيقة أنه يعمل في بعض الحالات قد يكون "الحظ" بدلا من سلوك موثقة.

وPS. باستخدام طريقة الحذف من بدلا من ملف يشبه الفشل سيكون أكثر إفادة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top