在创建审计触发器时抛出警告作为编译错误

时间:2011-12-22 12:56:35

标签: oracle oracle10g

我尝试创建一个审计触发器,它会抛出编译错误。

你能帮我创建触发器吗?

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 个答案:

答案 0 :(得分:0)

您没有提供确切的错误消息,也没有提供表h_dat_cample_req的结构,所以我担心我不得不猜测。

我怀疑h_dat_cample_req中的列名不符合您的预期,或者表中还有其他列未在INSERT语句中指定值。< / p>

您正在使用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表是一个历史表,并且有一个列用于执行的操作类型?

相关问题