0

我是触发器的新手。我在下面创建了一个触发器:

CREATE OR REPLACE TRIGGER ac01_control_trigg
AFTER INSERT ON AC01_CONTROL_TEST 
FOR EACH ROW
DECLARE
    BEGIN
   IF :NEW.cur_pgm_name = 'LSN' AND :NEW.nxt_pgm_name ='MD' AND :NEW.file_status='RD' THEN 
   UTL_FILE.Fcopy (:NEW.FILE_PATH,:NEW.FILE_NAME,:NEW.FILE_PATH,'CP.txt');
    INSERT INTO AC1_CONTROL_TEST 
    ( FILE_NAME, FILE_PATH,CUR_PGM_NAME,NXT_PGM_NAME,FILE_STATUS )
    VALUES (:NEW.FILE_NAME, :NEW.FILE_PATH,:NEW.CUR_PGM_NAME,'MD_MPS',:NEW.FILE_STATUS);   
END IF;
END ac01_control_trigg;

创建触发器时没有编译错误。但是当我试图在表中插入一个条目时,我收到以下错误。

ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 258
ORA-06512: at "SYS.UTL_FILE", line 1167
ORA-06512: at "CNGDB18.AC01_CONTROL_TRIGG", line 4
ORA-04088: error during execution of trigger 'CNGDB18.AC01_CONTROL_TRIGG'

有人可以帮忙吗?

编辑:插入语句如下:

INSERT INTO AC01_CONTROL_TEST
   (FILE_NAME, FILE_PATH, CUR_PGM_NAME, NXT_PGM_NAME, FILE_STATUS)
 VALUES
   ('SSMS_FSMS_ID000386_T20081224153437_OFWPAC_OMG011.DAT', '/dhiusr3/sub/cng/cngwrk18/var/m3g/projs/up/data/MAF_SMS/20091216/13/15490000/', 'LSN', 'MD', 'RD');

在 unix 上:

0> pwd
/dhiusr3/sub/cng/cngwrk18/var/m3g/projs/up/data/MAF_SMS/20091216/13/15490000
4

2 回答 2

2

有两种方法可以为 UTL_FILE 指定目标操作系统目录。您正在使用的方法 - 操作系统路径 - 是较旧的方法。当使用实际路径时,我们需要将它们包含在 INIT.ORA 文件(或 spfile)的 UTL_FILE 参数中。这是一个令人头疼的问题,因为每次我们更改参数时都必须反弹数据库。

另一种方法是使用目录对象。

create or replace directory whatever as 
  '/dhiusr3/sub/cng/cngwrk18/var/m3g/projs/up/data/MAF_SMS/20091216/13/15490000'
/
grant read, write on directory whatever to benjamin
/

这些语句必须由具有 CREATE ANY DIRECTORY 权限的用户(可能是 DBA)运行。

使用目录的好处是我们可以在不反弹数据库的情况下创建目录对象。它还使维护更容易,因为我们只需要在一个地方更改路径(尽管这不适用于您的情况)。

处理路径的旧方法的一个优点是我们可以在 UTL_FILE_DIR 参数中使用 *,因此我们可以指定子树。我们必须为每个目录显式声明一个单独的 Directory 对象。许多人将 UTL_FILE_DIR 在这方面的灵活性视为安全漏洞而非优势。除此之外,UTL_FILE_DIR 公开的目录被有效地授予 PUBLIC,而我们可以以低得多的粒度级别授予 Directory 对象的特定权限。

无论我们选择目标目录的哪种方法,oracle操作系统用户都必须具有必要的访问级别。换句话说,如果oracle操作系统用户无法在 unix 中的该目录中写入(或读取)文件,则 UTL_FILE 将 hurl ORA-29280: invalid directory path

不确定尾部斜杠是否会成为问题。CREATE DIRECTORY 语句无关紧要,命名路径方法可能更麻烦。但这当然没有必要。

于 2010-02-26T06:16:01.557 回答
0

你确定吗

UTL_FILE.Fcopy (:NEW.FILE_PATH,:NEW.FILE_NAME,:NEW.FILE_PATH,'CP.txt');

给你一个有效的路径?
:NEW.FILE_PATH 是根目录的完整路径吗?
它有前导/包含吗?

Oracle 不是我真正的领域,但请查看oracle.com 的此链接以获取一些指导。我无法判断您的触发器是否正确,但根据我对错误的阅读,FCOPY 函数抱怨路径不正确。

于 2010-02-26T05:19:37.337 回答