Reputation: 11
I am trying to create trigger which fires and store results in aud table when any new row has been updated or inserted in the source table. I am using below script to create that trigger:
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;
/
I am able to create the trigger successfully. But when I am inserting/updating any records in source table, it writes to aud table regardless of the value of row_updater_nam column. I have used != 'm_s_u' and != 's_s_u' in the trigger script, but it seems like it is ignoring it. Can anyone help me to get it resolved? If you feel my trigger script is not accurate, please advise as well.
Thank You
Upvotes: 1
Views: 33
Reputation: 870
It seems like a simple mistake in the logical operators used. You have
IF UPDATING AND :Old.Row_Updater_Nam != 'M_S_U' OR :Old.Row_Updater_Nam != 'S_S_U' THEN
While you should be using AND
instead of OR
:
IF UPDATING AND :Old.Row_Updater_Nam != 'M_S_U' AND :Old.Row_Updater_Nam != 'S_S_U' THEN
The same goes for INSERTING
. Is:
ELSIF INSERTING AND :New.Row_Updater_Nam != 'M_S_U' OR :New.Row_Updater_Nam !='S_S_U' THEN
Should be:
ELSIF INSERTING AND :New.Row_Updater_Nam != 'M_S_U' AND :New.Row_Updater_Nam !='S_S_U' THEN
I'm assumint that ROW_UPDATER_NAM
column is not nullable. Otherwise you may have issues with those conditions, when it is NULL
.
Upvotes: 1