Проблема с UTL_FILE.FCOPY в триггере - PullRequest
0 голосов
/ 26 февраля 2010

Я новичок в триггерах. Я создал триггер ниже:

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 ]

2 голосов
/ 26 февраля 2010

Существует два способа указания целевых каталогов ОС для UTL_FILE. Метод, который вы используете - путь к ОС - более старый. При использовании реальных путей нам нужно включить их в параметр UTL_FILE в файле INIT.ORA (или в spfile). Это боль в шее, потому что база данных должна возвращаться каждый раз, когда мы меняем параметр.

Вместо этого можно использовать объект каталога.

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 (возможно, администратором баз данных).

Преимущество использования каталогов состоит в том, что мы можем создавать объекты каталогов без отскока базы данных. Это также облегчает обслуживание, поскольку нам нужно изменить путь только в одном месте (хотя это не относится к вашему случаю).

Одно преимущество более старого метода обработки путей состоит в том, что мы можем использовать * в параметре UTL_FILE_DIR, чтобы мы могли указывать поддеревья. Мы должны явно объявить отдельный объект Каталога для каждого каталога. Многие люди считают гибкость UTL_FILE_DIR в этом отношении скорее ошибкой безопасности, чем преимуществом. Помимо всего прочего, каталоги, предоставляемые UTL_FILE_DIR, фактически предоставляются PUBLIC, в то время как мы можем предоставлять определенные привилегии для объектов Каталога с гораздо более низким уровнем детализации.

Независимо от того, какой подход мы выбираем целевой каталог, крайне важно, чтобы пользователь ОС oracle имел необходимый уровень доступа. Другими словами, если пользователь ОС oracle не может записать (или прочитать) файл в этом каталоге в unix, UTL_FILE бросит ORA-29280: invalid directory path.

Не уверен, будет ли косая черта проблемой. Оператору CREATE DIRECTORY все равно, подход с именованным путем может быть более сложным. Но это, конечно, не обязательно.

0 голосов
/ 26 февраля 2010

Вы уверены, что

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

дает вам правильный путь?
это: NEW.FILE_PATH полный путь от корневого каталога?
есть ли ведущие / включены?

Oracle на самом деле не моя область, но посмотрите эту ссылку на oracle.com за некоторыми рекомендациями. Я не могу сказать, является ли ваш триггер правильным или нет, но, судя по моему прочтению ошибки, функция FCOPY жалуется на неверный путь.

...