Mysql:SIGNAL SQLSTATE阻止插入数据

时间:2016-10-21 14:59:49

标签: mysql triggers

我有一个before触发器,可以防止数据更新到表中。为此,我使用了" SIGNAL SQLSTATE' 45000' SET MESSAGE_TEXT ='不允许此操作。&#39 ;;"。 同时还要将数据插入另一个表中。 但是它阻止了数据的插入。我的代码如下。

CREATE TRIGGER TRG_RESTRICT_UPDATE
BEFORE UPDATE ON AUDIT_DATA  
FOR EACH ROW  
BEGIN


   INSERT INTO AUDIT_DATA_OTHER
           (PRACTICE_GROUP_ID
           ,AUDIT_TYPE
           ,AUDIT_SUB_TYPE
           ,AUDIT_SOURCE
           ,EXTERNAL_SYSTEM_TYPE
           ,AUDIT_DATA
           ,FOUND_SET_AUDIT_DATA
           ,OWNER_TYPE
           ,OWNER_ID
           ,CUSTOMER_ID
           ,PATIENT_NUMBER
           ,PATIENT_FIRST_NAME
           ,PATIENT_LAST_NAME
           ,PATIENT_MIDDLE_NAME
           ,PATIENT_BIRTH_DATE
           ,AUDIT_INFO
           ,IP_ADDRESS
           ,WORKSTATION_NAME
           ,CREATE_BY
           ,CREATE_DATE
           ,CREATE_PROCESS
           ,USERNAME
           ,IS_EMERGENCY_MODE
           ,EMERGENCY_NOTES
           ,EMERGENCY_FIRST_NAME
           ,EMERGENCY_LAST_NAME
           ,ENCOUNTER_TYPE
           ,ENCOUNTER_DATE
           ,ENCRYPTED_AUDIT_DATA)
     VALUES
           (1
           ,'AttemptToModifyAuditRecord'
           ,'Update'
           ,'MAXIMEYES_APPLICATION'
           ,''
           ,NULL
           ,''
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,'SQL query which attempted to execute:Update'
           ,NULL
           ,NULL
           ,-1
           ,NOW()
           ,1
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL
           ,NULL);


SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'This operation is not allowed.';


END $$

1 个答案:

答案 0 :(得分:0)

触发器中引发的异常会有效地停止并回滚任何事务,因此它也会将插入回滚到日志表中 - 前提是日志表也是事务性的。

正如MySQL documentation on triggers所说:

  

触发器不能使用显式或隐式开始或结束事务的语句,例如START TRANSACTION,COMMIT或ROLLBACK

因此,您唯一真正的机会是使用非/事务日志表,例如myisam表,因为回滚不适用于该插入。