오라클 SQLPLUS Trigger(트리거 ) 관련...

georgek의 이미지

안녕하세요.
독학으로 공부중인데 연습문제가 어려워서 풀어봤는데 이게 맞는지 여쭤보려고 글을 올려보게 되었습니다.

일단 과정은 다음과 같습니다.
(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은 써주지 않았습니다.(맞는지 모르겠네요 ㅜㅜ)

그리고!! 트리거는 어떻게 테스트 해볼 수 있는지 알려주실 수 있나요?

감사합니다.

chanik의 이미지

하나의 트리거를 두 개의 테이블에 동시에 걸지 못하므로, 두 테이블에 각각 트리거를 따로 만들어야 합니다 (PL/SQL Reference의 CREATE TRIGGER Statement 페이지 에서 dml_event_clause 부분을 보시면 테이블을 복수개 지정하는 문법은 정의되어 있지 않습니다). 올려주신 트리거를 아래와 같이 쪼개 써야 할 것입니다.

CREATE OR REPLACE TRIGGER OrderBackup
BEFORE DELETE ON Orders
FOR EACH ROW
BEGIN
  INSERT INTO Backup_Orders VALUES ( :old.orderid,:old.clientid,:old.employeeid,:old.orderdate,:old.shipcountry ) ;
END;
 
CREATE OR REPLACE TRIGGER OrderProductBackup
BEFORE DELETE ON Order_Product
FOR EACH ROW
BEGIN
  INSERT INTO Backup_Order_Product VALUES ( :old.orderid,:old.productid,:old.unitprice,:old.quantity,:old.discount);
END;

테스트는, Orders 테이블에 delete 문을 실행한 다음, Orders에서 지워진 레코드가 Backup_Orders 테이블에 잘 들어갔는지를 확인해보면 됩니다. 예를 들면 이런식이 되겠죠.
georgek의 이미지

감사합니다!!

알려주신 트리거에 좀더 조합해서 결국 해결했습니다.

정말 감사합니다 !!:)

댓글 첨부 파일: 
첨부파일 크기
Image icon question_kldp.JPG21.44 KB
chanik의 이미지

거의 다 하셨는데 SQL 문법이 헷갈려서 해결이 안 되는 것 같네요. 아래와 같이 하시면 될 겁니다. 테이블 대충 만들어서 테스트해본 코드입니다.

CREATE OR REPLACE TRIGGER OrderBackup
BEFORE DELETE ON Orders
FOR EACH ROW
BEGIN
  INSERT INTO Backup_Orders VALUES (:old.orderid,:old.clientid,:old.employeeid,:old.orderdate,:old.shipcountry);
  INSERT INTO Backup_Order_Product
    SELECT * FROM order_product WHERE order_product.orderid=:old.orderid;
  DELETE FROM order_product WHERE orderid=:old.orderid;
  --DELETE FROM orders where orderid=:old.orderid;
END;
/
chanik의 이미지

올리고보니 이미 해결하셨네요. ^^

그런데, 문제를 엄밀히 적용하려면 아래의 조건도 해결해야 하지 않나요? Backup_Orders 테이블만 언급하고 Backup_Order_Product 테이블에 생성에 대해서는 조건이 없는 것도 이상하네요. 문제가 완전히 기술된 것은 아닌 것 같습니다.

Quote:
(2) "Orders" 테이블에서 주문 레코드(record)가 삭제되기전에 trigger는 "Backup_Orders"라고 불리는 테이블을 만들어야 하고

어쨌든, 트리거 안에 DDL을 넣으려면 dynamic sql을 써야 하고, 트리거 컴파일 및 동작시점에 Backup_Orders 테이블이 존재하지 않을 수 있다는 가정도 넣어야 하므로 생각할 점이 좀 생깁니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.