Я создал каталог оракула (SIMPLEDIR), и он указывает на физическое местоположение на диске.Версия Oracle - 12C.
Пользователь имеет права «CREATE ANY DIRECTORY» и «DROP ANY DIRECTORY», что подтверждается запросом
SELECT 'DIR' gtype, PRIVILEGE
FROM sys.dba_sys_privs
WHERE grantee = 'MY_TEST_USER1';
. Также можно подтвердить, что пользователь имеет права на созданиеи читать файлы.
SELECT *
FROM all_tab_privs
WHERE table_name = 'SIMPLEDIR';
Теперь я использую следующий блок для создания файла на диске
declare
fHandle UTL_FILE.FILE_TYPE;
begin
fHandle := UTL_FILE.FOPEN('SIMPLEDIR', 'my_test_1.txt', 'w');
UTL_FILE.PUT_LINE(fHandle, 'This is the first line');
UTL_FILE.PUT_LINE(fHandle, 'This is the second line');
UTL_FILE.PUT_LINE(fHandle, 'This is the third line');
UTL_FILE.FCLOSE(fHandle);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || ' SQLERRM=' || SQLERRM);
RAISE;
end;
Это работает нормально и может подтвердить, что файл теперь находится на диске, и я могутакже прочитайте файл, используя скрипт simillar, как указано выше.Однако, когда я пытаюсь удалить файл с помощью приведенного ниже сценария, я получаю сообщение об ошибке.
declare
fHandle UTL_FILE.FILE_TYPE;
begin
utl_file.fremove('SIMPLEDIR', 'my_test_1.txt');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || ' SQLERRM=' || SQLERRM);
RAISE;
end;
Сообщение об ошибке выглядит следующим образом
Error report:
ORA-29291: file remove operation failed
ORA-06512: at line 8
29291. 00000 - "file remove operation failed"
*Cause: A file deletion attempt was refused by the operating system.
*Action: Verify that the file exists and delete privileges granted on
the directory and the file.
Это не проблема блокировки файла, так как еслиЯ создаю файл и копирую в то же место вручную, но его не удается удалить.Как я могу получить более подробную информацию о точной причине ошибки.
Мне кажется, что это проблема уровня ОС, поскольку в сообщении об ошибке «Операция удалена при попытке удаления файла».
Это прекрасно работает во внутренних системах, где БД размещается на сервере Windows, но не работает на клиенте, где БД размещается в Linux.