SQL Trigger не работает для аудита - PullRequest
0 голосов
/ 30 мая 2018

Требование: После любого обновления значения столбца в таблице OPS_BUILD_ACTIVITY_LABEL мы должны вставить одну строку в таблицу ACTIVITY_LABEL_AUDIT_LOG, столбцы которой имеют вид TABLE_NAME, COLUMN_NAME, OLD_VALUE, NEW_VALUE, UPDATED_BY, UPDATED_DTM

. Я создал Trigger, как показано ниже.Триггер создан с приведенными ниже ошибками компиляции:

PL/SQL: SQL Statement ignored
PL/SQL: ORA-00984: column not allowed here

Пожалуйста, помогите мне в этом.

create or replace TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER UPDATE OF ACTIVITY_LABEL, NOTES
ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
   ( TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)   
     VALUES   

   ('OPS_BUILD_ACTIVITY_LABEL',
    'ACTIVITY_LABEL',
    OLD.ACTIVITY_LABEL,
    NEW.ACTIVITY_LABEL,
    NEW.LAST_UPDATED_BY,
    NEW.LAST_UPDATED_DTM); 

END;

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

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

create or replace TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER UPDATE OF ACTIVITY_LABEL, NOTES
ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
 if ( nvl(:OLD.ACTIVITY_LABEL,'xYz#@!') != nvl(:NEW.ACTIVITY_LABEL,'xYz#@!')) then
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)
  VALUES  
    ('OPS_BUILD_ACTIVITY_LABEL',
     'ACTIVITY_LABEL',
     :OLD.ACTIVITY_LABEL,
     :NEW.ACTIVITY_LABEL,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM);
 end if;

 if (nvl(:OLD.NOTES,'xYz#@!') != nvl(:NEW.NOTES,'xYz#@!') ) then
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)
  VALUES  
    ('OPS_BUILD_ACTIVITY_LABEL',
     'NOTES',
     :OLD.NOTES,
     :NEW.NOTES,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM);
 end if;
END; 
0 голосов
/ 30 мая 2018

Просто добавьте префикс OLD и NEW к двоеточиям (:), как показано ниже ( ORA-00984 рейз из-за этого, кстати, я предполагаю, что с именами столбцов проблем нет):

CREATE OR REPLACE TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
 if ( nvl(:OLD.ACTIVITY_LABEL,'xYz#@!') != nvl(:NEW.ACTIVITY_LABEL,'xYz#@!')
   or nvl(:OLD.NOTES,'xYz#@!') != nvl(:NEW.NOTES,'xYz#@!') ) then
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)
  VALUES  
    ('OPS_BUILD_ACTIVITY_LABEL',
     'ACTIVITY_LABEL',
     :OLD.ACTIVITY_LABEL,
     :NEW.ACTIVITY_LABEL,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM);
 end if;
END;

Что касается вашего комментария, я удаляю деталь UPDATE OF ACTIVITY_LABEL, NOTES и сравниваю для двух столбцов ACTIVITY_LABEL и NOTES в IF .Если вы хотите получать каждый журнал для каждой операции update , вам также следует удалить оператор IF .

...