2011-12-22 80 views
0

我嘗試創建一個審計觸發器,它引發編譯錯誤。同時創建審計觸發器拋出警告作爲編譯錯誤

請你幫我創建觸發器..

DROP TRIGGER DB.DAT_CAMPLE_REQ_Test; 

CREATE OR REPLACE TRIGGER DB."DAT_CAMPLE_REQ_Test" 
AFTER insert or update or delete on DAT_CAMPLE_REQ 
FOR EACH ROW 
declare 
    dmltype varchar2(6); 
BEGIN 
    if deleting then 

    INSERT INTO h_dat_cample_req VALUES  (  
     :Old.REQUEST_ID,  
     :Old.SAMPLE_ID,  
     :Old.CASSAY_ID,  
     :Old.CASCADE_ID,  
     :Old.STATUS_ID,  
     :Old.AUTHOR,  
     :Old.CRT_SAE,  
     :Old.SCREEN_SAE 
    ); 

    else 

    if inserting then 

     dmltype := 'insert'; 

    elsif updating then 

     dmltype := 'update'; 

    end if; 

    INSERT INTO h_dat_cample_req VALUES 
    (
     :New.REQUEST_ID, 
     :New.SAMPLE_ID, 
     :New.CASSAY_ID, 
     :New.CASCADE_ID, 
     :New.STATUS_ID, 
     :New.AUTHOR, 
     :New.CRT_SAE,  
     :New.SCREEN_SAE 
    ); 

    end if; 

END; 
+1

你得到的錯誤將是一個很大的幫助。與編譯錯誤創建 – 2011-12-22 13:21:44

+0

觸發...這是笏我越來越...... – user1111706 2011-12-22 14:01:55

+0

要查看錯誤,請鍵入:'SHOW ERRORS TRIGGER DB.DAT_CAMPLE_REQ_Test' – 2011-12-22 14:39:45

回答

0

您還沒有提供確切的錯誤信息,也不表h_dat_cample_req的結構,所以恐怕我將不得不猜測。

我懷疑h_dat_cample_req中的列名不符合您的預期順序,或者表中沒有爲INSERT語句指定值。

您正在使用INSERT聲明沒有列出的每個值應該在該列。使用這種形式的INSERT語句的問題在於,如果表中的列不完全按照您認爲的順序排列,或者存在已添加或刪除的列,則會發生錯誤,並且會很難追蹤到它。此外,如果您沒有收到編譯錯誤,仍然有可能將數據插入到錯誤的列中。對列進行命名可以清楚地知道哪個值位於哪個列中,便於識別已刪除的列,還意味着您無需爲表中的所有列指定值 - 未列出的列中的任何列將獲取一個NULL值。

我會強烈建議始終命名列INSERT語句。換句話說,而不是寫

INSERT INTO some_table VALUES (value_1, value_2, ...); 

INSERT INTO some_table (column_1, column_2, ...) VALUES (value_1, value_2, ...); 

順便說一句,你值分配給您的變量dmltype但你沒有在任何地方使用它的價值。這不會導致編譯錯誤,但這是一個跡象表明你的觸發器可能沒有達到你期望的水平。也許你的h_dat_cample_req表是一個歷史表,並有一個列的執行操作的類型?