ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle SQL] ON UPDATE CASCADE 대체 방법
    학교 수업/2-2 데이터베이스 기초 2021. 10. 12. 00:00
    반응형

    Oracle SQL은 ON DELETE CASCADE를 지원하지만, ON UPDATE CASCADE를 지원해주지 않습니다.

    그래서 PRIMARY KEY를 변경해야하는데, 동시에 FOREIGN KEY도 값이 변경되게 만들어야 하는 상황에서는 TRIGGER를 만들어서 변경해야 합니다.

     

    먼저 데이터베이스를 하나 만들겠습니다. 데이터베이스는 책에 나온 EMPLOYEE 테이블과 나머지들을 변형해서 만들어봤습니다.

     

    1. EMPLOYEE : 직원 정보가 들어있는 테이블
      • Name : 직원의 이름
      • Ssn : 직원의 사회보장번호(우리나라로 치면 주민등록번호)
      • Dno : 부서 번호
    2. DEPARTMENT : 부서 정보가 들어있는 테이블
      • Dname : 부서의 이름
      • Dnumber : 부서 번호
      • Mgr_ssn : 부서의 총책임자 사회보장번호

     

    DEPARTMENT의 Mgr_ssn이 EMPLOYEE의 Ssn을 참조하도록 만들어줍니다.

    이제 튜플들을 추가해줍니다.

     

    이제 EMPLOYEE 테이블의 Ssn을 변경하려고 하는데, Ssn이 '123456789'인 Person이라는 사람의 Ssn을 '999999999'로 변경하려고 합니다.

     

    Person의 Ssn과 관련되어 있는 것은 DEPARTMENT 테이블의 'HUMAN'이라는 이름의 부서입니다.

     

    먼저 TRIGGER를 작성할 문법은 아래와 같습니다.

    CREATE OR REPLACE TRIGGER (트리거 이름)
    AFTER UPDATE OF (수정할 테이블의 애트리뷰트) ON (수정할 테이블)
    FOR EACH ROW
    BEGIN
        UPDATE (FK 테이블 이름)
        SET (바뀔 FK 테이블의 애트리뷰트) = :NEW.(PK 테이블의 애트리뷰트)
        WHERE (바뀔 FK 테이블의 애트리뷰트) = :OLD.(PK 테이블의 애트리뷰트);
        ...
    END;
    /

    이런식으로 적어주면 됩니다.

     

    UPDATE를 하려면 CREATE 다음 OR REPLACE를 추가해줘야 값을 변경할 수 있고, AFTER 다음 UPDATE를 입력해야 UPDATE를 할 때만 트리거가 발동됩니다.

     

     

    우리는 EMPLOYEE 테이블의 Ssn 애트리뷰트를 변경할 때, DEPARTMENT의 테이블 Mgr_ssn 애트리뷰트도 바뀌게 만들어야 하니 아래와 같이 작성해야 합니다.

     

    이제 Person의 Ssn을 '999999999'로 바꾸어봅시다.

     

    이렇게 EMPLOYEE 테이블뿐만 아니라 DEPARTMENT 테이블의 값도 바뀐 것을 확인할 수 있습니다.

     

    마지막으로 트리거를 다 사용했을 경우 삭제해주면 됩니다.

    반응형

    댓글

Designed by Tistory.