首页 > 解决方案 > Oracle:目录权限

问题描述

我运行 write_test 程序,效果很好。

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;

标签: oracleplsql

解决方案


查看此论坛回复:https ://community.oracle.com/thread/4145239?start=0&tstart=0

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


推荐阅读