при создании предупреждения об ошибке триггера как ошибка компиляции - PullRequest
0 голосов
/ 22 декабря 2011

Я пытаюсь создать триггер аудита, он выдает ошибку компиляции.

Не могли бы вы помочь мне для создания триггера ..

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 голосов
/ 23 декабря 2011

Вы не предоставили ни точное сообщение об ошибке, ни структуру таблицы 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 является таблицей истории и содержит столбец для типа выполняемой операции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...