我正在尝试创建触发器,该触发器将在任何新行已更新或插入到源表中时将结果存储在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;
/
我能够成功创建触发器。但是,当我在源表中插入/更新任何记录时,无论row_updater_nam列的值如何,它都会写入aud表。我在触发脚本中使用了!='m_s_u'和!='s_s_u',但似乎忽略了它。 谁能帮助我解决问题? 如果您觉得我的触发脚本不正确,也请提出建议。
谢谢
答案 0 :(得分:1)
在使用的逻辑运算符中,这似乎是一个简单的错误。你有
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
也是如此。是:
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
时,您可能会遇到这些问题。