我已经创建了oracle目录(SIMPLEDIR),它指向磁盘上的物理位置。 Oracle版本为12C。
用户具有通过查询确认的“创建任何目录”和“删除任何目录”授权
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;
这可以正常工作,并且可以确认文件现在在磁盘上,并且我还可以使用上述类似脚本来读取文件。 但是,当我尝试使用以下脚本删除文件时,出现错误。
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.
这不是文件锁定问题,因为如果我创建文件并手动复制到同一位置,仍然无法删除。如何获得有关错误的确切原因的详细信息。
在我看来,这似乎是操作系统级别的问题,因为错误消息为“操作系统拒绝了文件删除尝试。”。
这在DB托管在Windows服务器中的内部系统中可以正常工作,但在DB托管在Linux上的客户中则无法使用。