오라클 SQLPLUS Trigger(트리거 ) 관련...
안녕하세요.
독학으로 공부중인데 연습문제가 어려워서 풀어봤는데 이게 맞는지 여쭤보려고 글을 올려보게 되었습니다.
일단 과정은 다음과 같습니다.
(1)trigger 이름은 OrderBackup으로 한다.
(2) "Orders" 테이블에서 주문 레코드(record)가 삭제되기전에 trigger는 "Backup_Orders"라고 불리는 테이블을 만들어야 하고, 삭제되는 모든 행(row)을 "Orders"테이블로부터 "Backup_Orders"테이블로 백업한다.
(3)그리고 "Order_Product"라는 테이블도 "Orders"테이블과 마찬가지로 레코드가 삭제되기전에 "Backup_Order_Product"테이블에 백업한다.
(4)위의 모든 과정이 끝나고나서 트리거는 "Orders"와 "Order_Product"테이블에서 레코드를 삭제한다.(After the above procedures are done, the trigger performs to delete records in “Orders” and “Order_Product” tables.)
제가 구현해본 코드는 다음과 같습니다
CREATE OR REPLACE TRIGGER OrderBackup
BEFORE DELETE ON Orders,Order_Product
FOR EACH ROW
BEGIN
INSERT INTO Backup_Orders VALUES ( :old.orderid,:old.clientid,:old.employeeid,:old.orderdate,:old.shipcountry ) ;
INSERT INTO Backup_Order_Product VALUES ( :old.orderid,:old.productid,:old.unitprice,:old.quantity,:old.discount);
END;
(1)과정에서 트리거이름을 OrderBackup으로 했습니다.
(2),(3)과정을 하나의 트리거에 넣으려고하는데 어떤식으로 넣어야할지 헷갈립니다.
아래 제가 작성한것과 같이 두개의 테이블을 ','로 구분해서 써주면 되는지...
또한 BEGIN파트에서 삭제되기전 넣어주는 건 어떻게 해야하는지도 헷갈리네요.
(책에는 제대로된 설명도 없는데...)
(4)에서는 이게 삭제되기전이니까 이 트리거가 끝나고나면 해당되는 레코드는 삭제될테니 따로 delete SQL은 써주지 않았습니다.(맞는지 모르겠네요 ㅜㅜ)
그리고!! 트리거는 어떻게 테스트 해볼 수 있는지 알려주실 수 있나요?
감사합니다.
하나의 트리거를 두 개의 테이블에 동시에 걸지
하나의 트리거를 두 개의 테이블에 동시에 걸지 못하므로, 두 테이블에 각각 트리거를 따로 만들어야 합니다 (PL/SQL Reference의 CREATE TRIGGER Statement 페이지 에서 dml_event_clause 부분을 보시면 테이블을 복수개 지정하는 문법은 정의되어 있지 않습니다). 올려주신 트리거를 아래와 같이 쪼개 써야 할 것입니다.
테스트는, Orders 테이블에 delete 문을 실행한 다음, Orders에서 지워진 레코드가 Backup_Orders 테이블에 잘 들어갔는지를 확인해보면 됩니다. 예를 들면 이런식이 되겠죠.
해결됐습니다!
감사합니다!!
알려주신 트리거에 좀더 조합해서 결국 해결했습니다.
정말 감사합니다 !!:)
거의 다 하셨는데 SQL 문법이 헷갈려서 해결이 안
거의 다 하셨는데 SQL 문법이 헷갈려서 해결이 안 되는 것 같네요. 아래와 같이 하시면 될 겁니다. 테이블 대충 만들어서 테스트해본 코드입니다.
올리고보니 이미 해결하셨네요. ^^ 그런데, 문제를
올리고보니 이미 해결하셨네요. ^^
그런데, 문제를 엄밀히 적용하려면 아래의 조건도 해결해야 하지 않나요? Backup_Orders 테이블만 언급하고 Backup_Order_Product 테이블에 생성에 대해서는 조건이 없는 것도 이상하네요. 문제가 완전히 기술된 것은 아닌 것 같습니다.
어쨌든, 트리거 안에 DDL을 넣으려면 dynamic sql을 써야 하고, 트리거 컴파일 및 동작시점에 Backup_Orders 테이블이 존재하지 않을 수 있다는 가정도 넣어야 하므로 생각할 점이 좀 생깁니다.
댓글 달기