Oracle:目录的权限

Oracle:目录的权限,oracle,plsql,Oracle,Plsql,我运行了write_测试过程,效果很好 begin koll_data_pkg.write_test(p_customer_id=>247, p_addr=>'address', p_dir=>'\\SERVER01\Backup\Log\'); end; 但是,当我将p_dir的值更改为另一个目录p_dir=>\SERVER12\Backup\Log\时,会出现以下错误: ORA-29283: invalid file operation ORA-06512: by

我运行了write_测试过程,效果很好

begin
    koll_data_pkg.write_test(p_customer_id=>247, p_addr=>'address', p_dir=>'\\SERVER01\Backup\Log\');
end;
但是,当我将p_dir的值更改为另一个目录p_dir=>\SERVER12\Backup\Log\时,会出现以下错误:

ORA-29283: invalid file operation
ORA-06512: by "SYS.UTL_FILE", 
ORA-29283: invalid file operation
ORA-06512: by "DATA_PKG", 
ORA-06512: by line 
我已尝试使用以下命令授予权限,但仍然存在相同的错误:

CREATE OR REPLACE DIRECTORY DEVO_INVREC_DIR AS '\\SERVER12\Backup\Log\';
GRANT READ, WRITE ON DIRECTORY DEVO_INVREC_DIR TO USER1;
GRANT READ, WRITE ON DIRECTORY DEVO_INVREC_DIR TO USER1;
GRANT EXECUTE ON UTL_FILE TO USER1;
程序:

procedure write_test(p_customer_id in koll_customer_party.customer_id%type,
                                 p_addr in varchar,
                                 p_dir in varchar,
                                 p_filename in varchar2 default null)
   is
       lt_id       id_tt;
       lt_bolagsnamn    bolagsnamn_tt;
       l_file           utl_file.file_type;
       l_line           varchar2(2048);
       l_name           varchar2(300):= 'DEVO_INVREC_DIR';
       l_filename       varchar2(100):= 'testfile.txt';
       l_sql            varchar2(512);
   begin

       select devo_id, bolagsnamn
          bulk collect into lt_id, lt_bolagsnamn
          from documents where customer_id=p_customer_id

       if lt_id.count > 0 then
            l_sql := 'create or replace directory ' || l_name || ' as ''' || p_dir || '''';
            execute immediate l_sql;

            if p_filename is not null then
                l_filename := p_filename;
            end if;
            l_file := utl_file.fopen(l_name,l_filename,'w');

            if utl_file.is_open(l_file) is not null then
               for i in lt_id.first .. lt_devo_id.last loop      
                    l_line:= lt_id(i) || ';' || replace(lt_bolagsnamn(i),';','');
                    utl_file.put_line(l_file, l_line);
               end loop;
            end if;
            utl_file.fclose(l_file);
       end if;
end;

查看此论坛回复:


总之,Oracle无法访问其默认安装配置中的网络共享,因为Windows系统用户根据定义无法访问网络共享。您要么必须重新配置Oracle,使其以非系统用户的身份运行,并具有共享权限,要么允许系统访问网络共享(这是一个巨大的安全风险)。我打算添加一个链接,描述如何将用户更改为另一个服务帐户,但它们似乎都已损坏或删除。这也可能取决于您的Oracle和Windows的确切版本,因此在没有其他文档的情况下,您最好与Oracle支持部门联系。您的问题没有简单的PL/SQL编程解决方案。

数据库服务器上的目录(或至少映射到它的目录)也是如此吗?它是一个拥有Oracle安装的帐户具有权限的目录吗?@APC:它是一个映射目录。我也尝试了z:\Backup\Log,但没有成功。您是否检查了共享驱动器的权限?在“高级共享/权限”对话框中检查了哪些用户?是的,它具有目录的所有权限,可以从oracle访问这些权限。