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



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

你能帮我创建触发器吗?

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; 

您没有提供确切的错误信息,也没有提供表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表是一个历史表,并且有一列用于执行操作的类型?

最新更新