2011-11-26 3 views
1

는 내가보기삭제 행은

에 행을 삭제하려고이 오류를 얻을 "ORA-01732 :이보기에없는 법적 데이터 조작 작업을"

발행

SQL 명령이 오류를 생성

DELETE FROM RegisterHelper 
WHERE StudentID = 111111111 AND CourseID = 'ASD123'; 

입니다. 나는이 값들이 존재하는지 다시 확인했다.

내보기 (트리거에 사용되는) 함께 자신의 상태와,

CREATE VIEW RegisterHelper AS 
SELECT studentId, courseID, NULL as position, 'registered' AS status 
FROM registeredOn 
UNION 
SELECT studentId, courseID, position, 'waiting' AS status 
FROM waitingOn; 

이보기는 모든 과정에서 대기하고 등록 된 학생의 전체 목록을 생성합니다. 여기에 제공된 모든 데이터는 트리거에 필수적입니다.

트리거

CREATE TABLE RegisteredOn (
    StudentID REFERENCES Student(StudentID) NOT NULL, 
    CourseID REFERENCES Course(CourseID) NOT NULL 
); 

CREATE TABLE WaitingOn (
    StudentID REFERENCES Student(StudentID) NOT NULL, 
    CourseID REFERENCES Course(CourseID) NOT NULL, 
    Position INT NOT NULL, 

    PRIMARY KEY(StudentID, CourseID) 
); 

가 난 단지 참조 값이있는 테이블에서 삭제하기 때문에, (명백하게) 참조하는로 값을 삭제 아무런 문제가 없을 것입니다 다음과 같이

CREATE OR REPLACE TRIGGER CourseUnregistration 
INSTEAD OF DELETE ON RegisterHelper 
etc 

테이블이있다 -이 아무런 문제가 없어야합니다.

재미있는 점은 실제로 몇 시간 전에 RegisterHelper보기에서 DELETE 명령을 실행하는 것이 었습니다. 웬일인지 작동을 멈췄다. 나는 그것을 기억하고있다.

트리거가 RegisterHelper보기에있는 이유는 학생이 RegisteredOn 및 WaitingOn 테이블에서 삽입되고 제거되기 때문입니다. 인서트는 정상적으로 작동하지만 오류가 발생하면 제거하지 않습니다.

간단히 말해서, 나는 무엇인가가 RegisteredOn 또는 WaitingOn 테이블에서 삭제 될 때 트리거가 작동하기를 원할뿐입니다. 누구든지 다른 해결책이 있다면 나는 그것에 대해 개방적이다.

답변

3

다른 유니 코드 표가있는보기에서는 삭제할 수 없습니다. 두 개의 서로 다른 delete 문 (각 테이블에 하나씩)을 실행해야합니다.

업데이트 지금 찾고있는 단일 삭제 문으로 코드에서 작업을 쉽게하기 위해, 당신이 삭제를 수행하는 저장 프로 시저를 만들 것을 제안 학생을 통과 할에서

및 이 과정에 대한 과정 정보.

나중에 같은 논리 (실습 등록)에서 데이터를 삭제해야하는 테이블을 추가하면 저장 프로 시저 만 수정하면되므로 동적 SQL.

+0

JOIN을 어떤 방식으로 사용하면 가능합니까? –

+0

@ayadew : 아니요, 테이블의 데이터 구조와 유추 된 논리로 작동하지 않을 것이라고 생각합니다. 기본적인 문제는 DELETE가 단일 테이블에서 작동하도록 설계되었지만이 테이블이 두 개에서 작동하기를 원한다는 것입니다. 대답에 대한 제안을 추가하겠습니다. –

+0

고마워요, 이것에 대해 살펴 보겠습니다. 답변을 수락하기 몇일 전에 질문을 계속합니다. –