삽입 및 업데이트를위한 MySQL Fire Trigger


111

테이블의 삽입 및 업데이트 이벤트 모두에 대해 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 개의 트리거를 사용해야합니까? 코드는 둘 다 동일하며 반복하고 싶지 않습니다.

답변:


126

두 개의 트리거를 만들어야하지만 공통 코드를 프로 시저로 이동하고 둘 다 프로 시저를 호출하도록 할 수 있습니다.


3
문법에 익숙하지 않은 우리를 위해 이것의 장난감 예를 줄 수 있습니까?
Zxaos 2011

3
@Zxaos : 나는으로 시작하는 게 좋을 것 dev.mysql.com/doc/refman/5.1/en/create-procedure.html (몇 가지 예를 포함) 및 필요한 경우 자신의 질문에 (들) 물어.
derobert

2
Oracle 에서처럼 AND / OR 연산자를 사용할 수 없다는 것은 유감입니다. 매개 변수를 통해 전체 변수 OLD 및 NEW를 프로 시저에 전달할 수없는 경우 더욱 그렇습니다. 내 코드는> 2x
Mikel 2013

두 번 코드 작성에 타협하지 개발자에 유용이 하나의 ...
Sayka

1
@luismartingil 프로 시저를 호출하는 것과 인라인하는 데 약간의 추가 오버 헤드가있을 수 있습니다. 그러나 그 대가로 유지 관리가 더 쉬워지고 두 트리거의 코드가 실수로 갈라지지 않도록 보장 할 수 있습니다.
derobert

46

@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 ;

트리거 및 절차를 정의하는 업무를 마쳤을 때 구분 기호를 복원하는 데주의를 기울입니다.


1
IN table_row_id VARCHAR(255)이 경우는 무엇입니까 ? 삽입되거나 업데이트 될 행을 어떻게 정의하고 있습니까?
VaTo 2016

13

불행히도 Oracle에서와 같이 INSERT 또는 UPDATE 설명 후에 MySQL에서 사용할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.