2012-12-04 2 views

답변

1

:

트리거는 명시 적 또는 암시 적으로 시작 또는 START의 트랜잭션으로 트랜잭션을 종료, COMMIT 또는 ROLLBACK 문을 사용할 수 없습니다.

대개 이렇게 불가능합니다. 당신이 할 수있는 일은 전체 거래가 실패 할 때 트리거에서 오류를 강제로내는 것입니다.

CREATE TRIGGER t1 BEFORE DELETE ON table1 
FOR EACH ROW 
BEGIN 
     IF (failCondition) THEN 
      SELECT 1/0 FROM table1 LIMIT 1 
     END IF; 
END 

이 오류를 트리거 전체 트랜잭션을 롤백 할

편집 :

그래서 문제에 대한 문제는이

CREATE TRIGGER preventLastStaffDeletion BEFORE DELETE ON Admission 
FOR EACH ROW 
BEGIN 
     DECLARE remaining INT DEFAULT 0; 
     SET remaining := (SELECT COUNT(staff) FROM Admission WHERE the_date = OLD.the_date AND work_time = OLD.work_time); 
     IF remaining = 1 THEN 
      SELECT 1/0 FROM Admission LIMIT 1 
     END IF; 
END 

하지나요 테스트 같은 것 문법 오류는 변명의 여지가 있지만 아이디어는 분명해야합니다. 단 하나의 왼쪽이 때까지

이 날짜에이 작업 시간을 가진 직원의 삭제를 할 수 있습니다

편집 2 다시 읽어

+0

당신이 수행하는 방법에 정교한 조건 실패 질문을 업데이트 실패 조건? DISTINCT를 사용하여 시도했지만 그것은 나를시키지 않습니다. –

+0

구체적인 예가 추가되었습니다 –

+0

LIMIT 1 전에 table1이 있는데 무엇을 의미합니까? –

관련 문제