Как получить триггер так, как хочет логика? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь создать триггер, который запускает и сохраняет результаты в таблице aud, когда любая новая строка была обновлена ​​или вставлена ​​в исходную таблицу. Я использую приведенный ниже скрипт для создания этого триггера:

CREATE OR REPLACE TRIGGER abc.E_M_IU_T
BEFORE INSERT OR UPDATE
ON abc.E_A_R_L_T
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
V_ID NUMBER;
BEGIN
SELECT MDM_SEQ_NBR.NEXTVAL INTO V_ID FROM dual;
IF 
UPDATING AND 
:Old.Row_Updater_Nam !='M_S_U' OR :Old.Row_Updater_Nam!='S_S_U' then
BEGIN 
            Insert Into abc.aud
                      ( MDM_IUD_SEQ_NBR
                       ,ENTITY_ID
                       ,ENTITY_TYPE_CD
                       ,DATA_CHANGE_CD
                       ,TABLE_NAME
                       ,PRIMARY_KEY_COL
                       ,SECONDARY_KEY_COL
                       ,PRIMARY_KEY_VAL
                       ,ROW_PROCESS_CD
                       ,ERROR_MSG
                       ,ROW_INSERT_DT
                       ,ROW_UPDATE_DT
                       ,ROW_UPDATER_NAM)
                Values ( V_ID
                       ,:Old.E_ID
                       ,:Old.E_CD
                       ,'C'
                       ,'E_A_R_L_T'
                       ,NULL
                       ,NULL
                       ,NULL
                       ,'N'
                       ,NULL
                       ,SYSDATE
                       ,NULL
                       ,'E_M_IU_T'); 
END; 
elsif INSERTING AND 
:New.Row_Updater_Nam !='M_S_U' OR  :New.Row_Updater_Nam !='S_S_U'  then
BEGIN 
            Insert Into abc.aud
                      ( MDM_IUD_SEQ_NBR
                       ,ENTITY_ID
                       ,ENTITY_TYPE_CD
                       ,DATA_CHANGE_CD
                       ,TABLE_NAME
                       ,PRIMARY_KEY_COL
                       ,SECONDARY_KEY_COL
                       ,PRIMARY_KEY_VAL
                       ,ROW_PROCESS_CD
                       ,ERROR_MSG
                       ,ROW_INSERT_DT
                       ,ROW_UPDATE_DT
                       ,ROW_UPDATER_NAM)
                Values ( V_ID
                       ,:New.E_ID
                       ,:New.E_CD
                       ,'C'
                       ,'E_A_R_L_T'
                       ,NULL
                       ,NULL
                       ,NULL
                       ,'N'
                       ,NULL
                       ,SYSDATE
                       ,NULL
                       ,'E_M_IU_T'); 

END; 
END IF;
END;
/ 

Я могу успешно создать триггер. Но когда я вставляю / обновляю любые записи в исходной таблице, она записывает в таблицу aud независимо от значения столбца row_updater_nam. Я использовал! = 'M_s_u' и! = 'S_s_u' в скрипте триггера, но похоже, что он его игнорирует. Может кто-нибудь помочь мне решить это? Если вы считаете, что мой триггерный скрипт некорректен, пожалуйста, сообщите об этом.

Спасибо

1 Ответ

0 голосов
/ 20 ноября 2018

Кажется, что это простая ошибка в используемых логических операторах.У вас есть

IF UPDATING AND :Old.Row_Updater_Nam != 'M_S_U' OR :Old.Row_Updater_Nam != 'S_S_U' THEN

В то время как вы должны использовать AND вместо OR:

IF UPDATING AND :Old.Row_Updater_Nam != 'M_S_U' AND :Old.Row_Updater_Nam != 'S_S_U' THEN

То же самое относится и к INSERTING.Is:

ELSIF INSERTING AND :New.Row_Updater_Nam != 'M_S_U' OR :New.Row_Updater_Nam !='S_S_U' THEN

Должно быть:

ELSIF INSERTING AND :New.Row_Updater_Nam != 'M_S_U' AND :New.Row_Updater_Nam !='S_S_U' THEN

Я предполагаю, что столбец ROW_UPDATER_NAM не может быть пустым.В противном случае у вас могут возникнуть проблемы с этими условиями, когда это NULL.

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