我有一个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 $$
答案 0 :(得分:0)
触发器中引发的异常会有效地停止并回滚任何事务,因此它也会将插入回滚到日志表中 - 前提是日志表也是事务性的。
正如MySQL documentation on triggers所说:
触发器不能使用显式或隐式开始或结束事务的语句,例如START TRANSACTION,COMMIT或ROLLBACK
因此,您唯一真正的机会是使用非/事务日志表,例如myisam表,因为回滚不适用于该插入。