2014-09-17 3 views
1

최근 Oracle 11G로 DB 용 버전이 업데이트되었습니다. 그 순간부터 파일 작성이 실패합니다.utl_file fopen - 파일에 텍스트를 쓸 수 없습니다.

내 코드 :

UTL_FILE.FOPEN('/tmp', 'file.txt', 'w'); 

나는 "ORA-29280 유효하지 않은 디렉토리 경로"내가 오라클 디렉토리 ("... 디렉토리를 생성")을 사용해야합니다 알고

를 얻었으나, 오라클 10G에서 그것은 명시적인 경로로 훌륭하게 작동했으며, 코드를 변경하고 싶지 않습니다.

감사합니다.

+0

거기에 쓸 수있는 권한이 있습니까? – AndreDuarte

+0

예. chmod 777/tmp – Refael

+0

데이터베이스를 어떻게 업그레이드 했습니까? 이전 버전의'utl_file_dir' 매개 변수가 새 버전에서 같은 값으로 설정되어 있습니까? 오라클은 디렉토리 객체를 사용할 것을 권장하고 있지만, 여전히 utl_file_dir을 사용하여 파일에 대한 액세스 권한을 부여 할 수 있습니다. 그것은 덜 안전합니다. –

답변

4

아니요 .. Document가 있습니다.

해결 방법은/tmp에 대한 ALL_DIRECTORIES를 사용하여 다음이 보안 문제에 대한 오라클은 더 이상 직접 파일 경로를 지원 보인다 FOPEN

SELECT DIRECTORY_NAME INTO MY_DIR FROM ALL_DIRECTORIES WHERE DIRECTORY_PATH='/tmp'; 

UTL_FILE.FOPEN(MY_DIR, 'file.txt', 'w'); 

에서 사용할 수 있습니다.

디렉토리는 제대로 생성되어야합니다.

CREATE OR REPLACE DIRECTORY TEMP AS '/tmp' 
/

GRANT READ, WRITE ON DIRECTORY TEMP TO MYUSER 
/

요청 된 전체 경로에 대해 요청 된 DB 디렉토리 이름을 반환하는 함수를 작성할 수 있습니다. 그리고 사용할 수없는 경우 기본 디렉토리 이름을 반환합니다.

EDIT :UTL_FILE_DIR은 하드 코딩 된 디렉토리 경로에 사용할 수 있습니다. INIT.ORA 매개 변수에 해당 디렉토리 경로가 있으면 제공됩니다. 그렇지 않으면 추가해야하며 데이터베이스가 반송되어야합니다.

아래 링크에는 하드 코딩 된 경로 대신 Directory 개체를 사용하는 방법과 사용 방법에 대한 유용한 정보가 있습니다.

http://www.otnblogs.com/using-oracle-directories-instead-utl_file_dir/

+0

먼저 디렉토리를 만들어야합니다. – Refael

+0

예 @ Reefael, 테마는 DBA에서 만든 디렉토리 만 액세스 할 수 있습니다. 우리는 10g에서 11g으로 마이그레이션 할 때이 변경 작업을 수행하기 위해 100 개 이상의 스크립트를 변경해야한다는 것을 기억합니다. 디렉토리 객체를 반환하는 함수를 작성하고, 그렇지 않은 경우 기본 디렉토리를 작성했습니다. –

+0

그래서 코드를 변경해야한다는 것을 이해합니다 ... – Refael