2014-06-11 13 views
1

안녕하세요, 제 데이터베이스에서 트리거를 만드는 데 문제가 있습니다.ORACLE 트리거 검사 표 및 행 삭제

  • 나라
  • 도시
  • 지방
  • 호수
  • 바다

그래서 :

나는 '위치'를 포함 명명 된 것 표를 호수 , 바다와 강은 외래 키입니다.

ALTER TABLE located 
ADD CONSTRAINT locatedLake 
     FOREIGN KEY (lake) 
     REFERENCES Lake(name) 
     ON DELETE SET NULL; 

ALTER TABLE located 
ADD CONSTRAINT locatedRiver 
     FOREIGN KEY (river) 
     REFERENCES River(name) 
     ON DELETE SET NULL; 

ALTER TABLE located 
ADD CONSTRAINT locatedSea 
     FOREIGN KEY (sea) 
     REFERENCES Sea(name) 
     ON DELETE SET NULL; 

그래서 때마다 나는 그것을 NULL로 설정되어 위치에있는 호수, 강 또는 바다를 삭제 :

나는이 세 가지 제약 조건을 만들었습니다.

는 지금이 트리거를 만들려고 :

CREATE OR REPLACE TRIGGER deleteFromLocated 
AFTER UPDATE ON located 
FOR EACH ROW 
BEGIN 
     DROP FROM located WHERE sea IS NULL AND river IS NULL AND lake IS NULL; 
END; 
/

을하지만 그때 나는 돌연변이의 오류가 발생합니다.

목표는이 세 가지가 null 인 모든 튜플을 삭제하는 것입니다.

누군가 나를 도울 수 있습니까? 당신이 :new 또는 :old가 특정 행이 갱신되고 처리하나요 사용하지 않는 때문에 사전에

덕분에

+0

왜 이것을 트리거로 사용 하시겠습니까? 성능에 신경 쓰는 프로덕션 시스템을 가정하면 세 개의 트리거와 패키지 (또는 임시 테이블) 또는 여러 부분이있는 11g 복합 트리거가 필요합니다. 그것은 일반적으로 나쁜 해결책입니다. 3 개의 열 모두가 NULL이되는 것을 방지하는 제약 조건을 생성 한 다음 부모 테이블에서 삭제할 때'위치한 '행을 삭제하도록 응용 프로그램을 수정할 수 있습니까? –

+0

이것은 강의를 위해 풀어야 할 과제입니다. 데이터베이스가 고정되어있어 트리거를 사용해야합니다. 우리는이 작업을 3 개의 트리거로 해결할 것입니다. 그러나,이 솔루션은 어떤 의미인지 불만족 스럽습니다. 제가 무슨 뜻인지 아시면 ... – Ennosigaeon

답변

1

첫째, FOR EACH ROW는 당신을 도움이되지 않습니다. FOR EACH ROW을 삭제 해보세요. (나는 지금 미안 함으로 시험 할 환경이 없다)

정말로 이것은 트리거를 잘 사용하지 않는 것처럼 보입니다. 대신 수 :

  • 항상 다음 위치에서 삭제, delete_lake DELETE FROM located WHERE sea IS NULL AND river IS NULL AND lake IS NULL;
  • 작성 절차 등 호수 테이블에서 삭제하는을 호수, 강, 바다 테이블 삭제를 따릅니다.
  • 더 효율적으로, 정말로이 두 가지 방법 중 하나를 수행해야하지만 행을 먼저 삭제해야합니다 (DELETE FROM located WHERE sea {theSeaBeingDeleted} AND river IS NULL AND lake IS NULL;). 이렇게하면 어쨌든 삭제하려는 행을 업데이트하지 않습니다.