0

트랜잭션이 삽입/업데이트/삭제 될 때 업데이트해야하는 quantity_on_hand 열이있는 제품 테이블이 있습니다. 삽입 테이블에서 트랜잭션의 수량으로 필드를 줄이고 업데이트에서 트랜잭션 내에서 NEWOLD 값을 줄이고 추가했습니다. DELETE 트리거에서 나는 단순히 OLD 트랜잭션 값을 기반으로 주식을 추가했습니다.MySQL 삭제 트리거가 다른 테이블 열을 업데이트하지 않음

INSERTUPDATE 트리거가 정상적으로 작동하지만 DELETE 트리거가 올바르게 업데이트되지 않고 오류가 발생하지 않습니다.

INSERT 트리거 (작업)

CREATE TRIGGER `tr_stockout_ai` AFTER INSERT ON `stockout` 
FOR EACH ROW BEGIN 
UPDATE stockin SET qoh = qoh - NEW.qty WHERE id_stockin = NEW.id_stockin; 
END; 
$$ 

UPDATE 트리거 (작업)

CREATE TRIGGER `tr_stockout_au` AFTER UPDATE ON `stockout` 
FOR EACH ROW BEGIN 
UPDATE stockin SET qoh = qoh + OLD.qty WHERE id_stockin = OLD.id_stockin; 
UPDATE stockin SET qoh = qoh - NEW.qty WHERE id_stockin = NEW.id_stockin; 
END; 
$$ 

트리거를 삭제하도록 구성

대로 작동하지 않는 : 여기에 코드입니다
CREATE TRIGGER `tr_stockout_ad` AFTER DELETE ON `stockout` 
FOR EACH ROW BEGIN 
UPDATE stockin SET qoh = qoh + OLD.qty WHERE id_stockin = OLD.id_stockin; 
END; 
$$ 

아무에게도 내가 여기에없는 것을 말해 줄 수 있습니까? 구문 오류가없고 코드가 트리거를 잘 생성하고 있으며 트리거가 실행 중이고 MySQL이 오류 코드를보고하지 않을 때 오류가 표시되지 않습니다. AFTER에서 BEFORE으로 변경하려고 시도했지만 문제는 같습니다. 행을 삭제 한 후에 qoh의 값은 동일하게 유지됩니다!

이 문제는 계속 발생합니다. MySQL 5.5를 실행하는 cPanel 기반 환경에서 다른 MySQL 데이터베이스 서버에서 테스트했습니다. 내 개발 서버와이 프로덕션 서버의 환경은 거의 같으며 문제는 같습니다. VARIABLE_NAME 값 innodb_version 1.1.8 버전 5.5.22-CLL version_comment의 MySQL 커뮤니티 서버 (GPL)

업데이트 : 삭제 명령이에 주어진 될 때 DELETE 트리거가 완벽하게 정상적으로 수행 stockout 표 즉 delete from stockout where id_stockout=12입니다. 그러나이 stockout 테이블에서 계단식 삭제가있는 테이블의 행을 삭제할 경우 계단식 삭제가 작동하지만 stockout의 삭제 트리거가 실행되고 있지 않습니다. 예 : 테이블 salesinv_det_itemsstockout에 외래 키로 기본 키를 가지고 있으며 관계는 계단식입니다. salesinv_det_items에서 행을 삭제할 때마다 stockout에있는 해당 외래 키 행은 삭제되지만 stockout에 대한 삭제 트리거는 실행되지 않습니다.

+0

VARIABLE_NAME \t 값 innodb_version \t 1.1.8 의 protocol_version slave_type_conversions \t 버전 \t 5.5.22-CLL version_comment \t의 MySQL 커뮤니티 서버 (GPL) version_compile_machine \t x86_64에 리눅스 – somnath

+0

\t version_compile_os "현재, 계단식 외래 키 동작은 트리거를 활성화하지 않습니다. " 이 버그로 내 데이터베이스가 죽습니다. Thay는 설명서에 정보를 추가하고 아무 것도 수정하지 않았습니다. – boreq

+1

@ficiek 여기가 같아요! 나는 그들이 세계의 나머지 부분이 가지고있는 최소한을 제공하지 못할 때 트리거와 외래 키를 제공하게 된 원인을 모른다. 그리고 그들은 MS SQL, Sybase, DB2 등과 비교합니다. 또 다른 몇 년 그리고 그 버그와 함께 사는 십년 될 것입니다! 업계에서는 이러한 취약점을 강조하여 비즈니스에서 금전적 인 손실을 유발하여 리소스를 투자하여이 버그를 해결하도록해야합니다. 그렇지 않으면 나는 그들이 오랫동안 그것을 고치지 않고 잘 살고 있다고 생각합니다. 그 수치심은 정말로! – somnath

답변

1

는 영업 이익이 쓴 :

답변 : MySQL은 5.0의 출시 이후 버그가하고 아직 외부 키 캐스케이드 작업에서 트리거를 트리거하지 않습니다이 날짜로 해석되지 않습니다. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

은 말한다 :는 현재 외래 키의 행동이 트리거를 활성화하지 캐스케이드.

놀라운 것처럼 보일 수도 있지만 사실입니다!

그런 다음 외부 키를 연결하지 말고 대신 해당 작업을 수행 할 트리거를 작성하십시오.

+0

([질문에 대답하여 커뮤니티 위키로 편집 및 변환] (http://meta.stackoverflow.com/questions/267434/what-is-the-appropriate-action-when-the-answer-to-a- question-is-the-que에 추가됨). –