触发器中的UTL_FILE.FCOPY问题

时间:2010-02-26 05:11:43

标签: sql oracle utl-file ora-04088

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

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

2 个答案:

答案 0 :(得分: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 OS用户都具有必要的访问级别至关重要。换句话说,如果oracle OS用户无法在unix中写入(或读取)该目录中的文件,UTL_FILE将向ORA-29280: invalid directory path投掷。

不确定尾部斜杠是否有问题。 CREATE DIRECTORY语句并不关心,命名路径方法可能比较麻烦。但这当然没有必要。

答案 1 :(得分:0)

你确定吗

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

给你一个有效的路径?
是:NEW.FILE_PATH从根目录的完整路径?
它有领先/包括?

Oracle不是我的专区,但请查看this link到oracle.com获取一些指导。我无法判断你的触发器是否正确,但是我对错误的解读是因为FCOPY函数抱怨路径不正确。