2010-02-26 4 views
0

트리거가 처음입니다. 트리거를 만드는 동안 어떤 컴파일 오류가 없는지트리거의 UTL_FILE.FCOPY 관련 문제

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'); 

:

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

해당 링크의 예제를 보면 FILE_PATH의 마지막 슬래시가 포함되어서는 안됩니다. 그 이름의 파일이 dir에 있다고 가정합니다. – MadMurf

+0

문제점이 트리거가 아닌 UTL_FILE과 관련됩니다. SQL * Plus 프롬프트에서 실행되는 PL/SQL 블록에서 코드가 여전히 실패합니다. – APC

답변

0

당신은

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

당신에게 유효한 경로를 제공하는 것이 확실합니까?
은 다음과 같습니다. NEW.FILE_PATH 루트 디렉토리의 전체 경로?
지도/포함?

오라클은 실제로 내 지역이 아니지만 일부 안내 사항은 oracle.com에서 this link을 확인하십시오. 귀하의 방아쇠가 맞는지 아닌지는 말할 수 없지만 오류를 읽으므로 FCOPY 기능이 올바르지 않은 경로에 관해 불평하고 있습니다.

+0

예. 전체 경로 .i는 question.pls 확인을 편집했습니다. – Vijay

+0

경로에 예제에없는 슬래시가 있습니다 ... 죄송합니다. – MadMurf

2

UTL_FILE의 대상 OS 디렉토리를 지정하는 두 가지 방법이 있습니다. 사용중인 방법 (OS 경로)은 이전 방법입니다. 실제 경로를 사용할 때 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 문은 상관 없습니다. 명명 된 경로 접근법은 더 까다로울 수 있습니다. 그러나 그것은 반드시 필요한 것은 아닙니다.