2010-02-26 8 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語句低於:

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 
+0

看看我在下面包含的鏈接中的例子,可能不應該包含FILE_PATH中的最後一個斜槓?這就是假定名稱中的文件存在於dir中。 – MadMurf 2010-02-26 05:35:06

+0

你的問題與UTL_FILE不是觸發器有關。您的代碼在SQL * Plus提示符處運行的PL/SQL塊中仍然會失敗。 – APC 2010-02-26 06:17:55

回答

0

你肯定

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

是給你一個有效的路徑?
是:NEW.FILE_PATH從根目錄的完整路徑?
它有領先/包括?

Oracle並不是我的區域,但請查閱this link以獲取一些指導。我無法分辨你的觸發器是否正確,但是我的錯誤是它的FCOPY函數抱怨路徑不正確。

+0

是它的完整路徑.i編輯了question.pls檢查。 – Vijay 2010-02-26 05:30:01

+0

該路徑具有示例沒有的尾部斜槓......對不起,沒有Oracle來檢查它。 – MadMurf 2010-02-26 05:35:45

2

有兩種方式爲UTL_FILE指定目標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,而我們可以對粒度級別更低的目錄對象授予特定的權限。

無論我們選擇目標目錄,oracle OS用戶具有必要的訪問級別至關重要。換句話說,如果oracle OS用戶不能在unix中寫入(或讀取)該目錄中的文件,則UTL_FILE將投擲ORA-29280: invalid directory path

不確定尾部斜線是否會成爲問題。 CREATE DIRECTORY語句並不在意,命名的路徑方法可能會更加複雜。但它當然沒有必要。