ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터베이스] Trigger 트리거
    데이터베이스 2024. 10. 6. 19:50

    Trigger는 MYSQL 에서 테이블에서 어떤 이벤트가 발생 했을 때 자동으로 실행되는 것을 말한다 

     

    이벤트 리스너라고 이해하면 된다

     

    다시 말해,

    어떤 테이블에서 특정한 이벤트가 발생했을때 (연산 inser, delete, update 등등) 

    실행시키고자 하는 추가 쿼리 작업들을 자동으로 수행할 수 있게끔 트리거를 미리 설정해 두는 것이다

    (테이블에 부착되는 프로그램 코드)

     

     

    MYSQL은 View에 트리거 부착이 불가능하다고 한다

     

     

    트리거 종류

     

    행 트리거

     

    • 테이블 안의 영향을 받은 행 각각에 대해 실행 된다
    • 변경 전 행이나 변경 후 행은 OLD, NEW 라는 가상 줄 변수를 사용하여 읽을 수 있다

    여기에서 OLD 는 이름의 뜻처럼 예전 데이터 라는 의미이며 delete로 삭제되 데이터나 update로 바뀌기전의 데이터

    NEW 는 이름의 뜻처럼 새 데이터라는 의미이고 insert 로 삽입된 데이터 또는 update로 바뀐 데이터를 의미한다

    더보기

    위 처럼 update 일 경우에는 OLD, NEW  둘다 쓸 수 있고

    delete는 new 를 인식 X

    insert는 OLD가 없다

     

     

     

    문장 트리거 

     

    • INSERT, UPDATE, DELETE 문에 대해 한번만 실행된다
    • 삽입, 갱신 또는 삭제되는 행 수에 관계없이 각 트랜잭션에 대해 명령문 레벨 트리거가 한 번 실행된다

     

    BEFORE 또는 AFTER는 트리거가 실행되는 시기를 지정한다

     

    AFTER 트리거 : 쿼리 이벤트 작동하기 후

    BEFORE 트리거 : 쿼리 이벤트 작동하기 전 (미리 데이터를 확인 가능하다)

     

     

    트리거 사용시 주의사항

     

    1. 복잡한 로직으로 인한 성능 저하

    • 트리거는 테이블의 각 행에 대해 실행될 수 있으므로, 복잡한 로직이나 많은 계산이 포함된 트리거는 성능을 저하시킬 수 있다
    • 특히 많은 데이터가 수정될 때 트리거가 반복적으로 실행되어 데이터베이스 부하가 커질 수 있다

     

    2. 트리거 간 상호작용

     

    • 여러 트리거가 하나의 테이블에서 동시에 작동할 경우, 예상하지 못한 상호작용이 발생할 수 있습니다
    • 예를 들어, BEFORE 트리거와 AFTER 트리거가 충돌하거나, 서로 다른 테이블의 트리거가 상호 의존하게 되면 유지보수가 매우 어려워집니다

     

    트리거 사용

    1. INSERT 트리거 예시

    CREATE TRIGGER before_employee_insert
    BEFORE INSERT ON employees
    FOR EACH ROW
    SET NEW.created_at = NOW();

     

     

    2. UPDATE 트리거 예시

    CREATE TRIGGER after_employee_update
    AFTER UPDATE ON employees
    FOR EACH ROW
    INSERT INTO employee_update_log (employee_id, old_salary, new_salary, updated_at)
    VALUES (OLD.id, OLD.salary, NEW.salary, NOW());

     

    3. DELETE 트리거 예시

    CREATE TRIGGER before_employee_delete
    BEFORE DELETE ON employees
    FOR EACH ROW
    INSERT INTO employees_backup (employee_id, name, salary, deleted_at)
    VALUES (OLD.id, OLD.name, OLD.salary, NOW());

     

     

     

    트리거는 생성된 후, 앞서 말한 것처럼 연산이 실행되면 자동으로 작동하는 구조입니다. 트리거는 직접 호출하지 않아도, 관련된 이벤트(INSERT, UPDATE, DELETE)가 발생하면 자동으로 실행된다.

     

    트리거 확인

    SHOW TRIGGERS;

     

    트리거 삭제 

    DROP TRIGGER [IF EXISTS] 트리거_이름;

Designed by Tistory.