테이블의 삽입 및 업데이트 이벤트 모두에 대해 mysql 트리거를 실행할 수 있습니까?
다음을 수행 할 수 있음을 알고 있습니다.
CREATE TRIGGER my_trigger
AFTER INSERT ON `table`
FOR EACH ROW
BEGIN
.....
END //
CREATE TRIGGER my_trigger
AFTER UPDATE ON `table`
FOR EACH ROW
BEGIN
.....
END //
하지만 어떻게 할 수 있습니까
CREATE TRIGGER my_trigger
AFTER INSERT ON `table` AND
AFTER UPDATE ON `table`
FOR EACH ROW
BEGIN
.....
가능합니까, 아니면 2 개의 트리거를 사용해야합니까? 코드는 둘 다 동일하며 반복하고 싶지 않습니다.
답변
두 개의 트리거를 만들어야하지만 공통 코드를 프로 시저로 이동하고 둘 다 프로 시저를 호출하도록 할 수 있습니다.
답변
@Zxaos 요청에 대한 응답으로 MySQL 트리거에 대한 AND / OR 연산자를 사용할 수 없기 때문에 코드부터 시작하여 동일한 작업을 수행하는 완전한 예입니다.
1. INSERT 트리거를 정의합니다.
DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost TRIGGER my_insert_trigger
AFTER INSERT ON `table`
FOR EACH ROW
BEGIN
-- Call the common procedure ran if there is an INSERT or UPDATE on `table`
-- NEW.id is an example parameter passed to the procedure but is not required
-- if you do not need to pass anything to your procedure.
CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;
2. UPDATE 트리거 정의
DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//
CREATE DEFINER=root@localhost TRIGGER my_update_trigger
AFTER UPDATE ON `table`
FOR EACH ROW
BEGIN
-- Call the common procedure ran if there is an INSERT or UPDATE on `table`
CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;
3. 다음 두 트리거에서 사용하는 공통 PROCEDURE를 정의합니다.
DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//
CREATE DEFINER=root@localhost PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN
-- Write your MySQL code to perform when a `table` row is inserted or updated here
END//
DELIMITER ;
트리거 및 절차를 정의하는 업무를 마쳤을 때 구분 기호를 복원하는 데주의를 기울입니다.
답변
불행히도 Oracle에서와 같이 INSERT 또는 UPDATE 설명 후에 MySQL에서 사용할 수 없습니다.