如何以逻辑方式获得触发?

时间:2018-11-19 22:26:57

标签: oracle triggers

我正在尝试创建触发器,该触发器将在任何新行已更新或插入到源表中时将结果存储在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',但似乎忽略了它。 谁能帮助我解决问题? 如果您觉得我的触发脚本不正确,也请提出建议。

谢谢

1 个答案:

答案 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时,您可能会遇到这些问题。