2012-11-28 3 views
0

기존 레거시 기반 시스템에서 우리는 사용자 인벤토리를 업데이트합니다. 인벤토리에는 많은 다른 항목이 포함되어 있으며 사용자는 항목 ID 당 하나의 행을 가지며 각 행은 자신이 소유 한이 항목의 수량입니다.시스템 내 젖니없는 버그 MySQL

어딘가에서 다소 오래되고 거대한 코드처럼 사용자가 마이너스 수량의 항목으로 끝날 수있는 문제가 있습니다. 이것은 결코 일어나서는 안됩니다.

위로부터 문제를 접근하고 인벤토리 테이블과 상호 작용하는 각 코드를 검토하는 대신 문제를 발견하는 데 도움이되는 몇 가지보고를 시도해 볼 수 있다고 생각했습니다.

내가이 문제를 해결할 것으로 생각되는 것을 구현하기에 앞서, 내가 어떻게 접근 할 수 있는지 알아 내기 위해 지역 사회에 배포 할 것이라고 생각했습니다.

업데이트 검사를 위해 다른 테이블에 활동을 삽입하는 MySQL 규칙을 업데이트하는 것으로 시작할 수 있습니다.

+0

, 내가 물어 봐야, 시스템은 확장 할 수있는 데이터베이스 클래스를 사용합니까? – jeroen

+0

_how_ "legacy"및 향후 지원해야 할 기간에 따라 'UPDATE'에 음수 값을 0으로 만드는 트리거를 만들면됩니다. 즉, 장래에 그 물건을 대체 할 수있는 기회가 있다면 그 깔개 아래서 쓸어 버리십시오. –

+0

제안 건배를위한 건배. 불행하게도 재정적 인 이유로 우리는이 레거시 코드 기반을 좀 더 오래 사용해야합니다. 그것은 mysqli 클래스를 사용하는 DB 클래스를 가지고 있으므로 너무 끔찍하지 않습니다. – David

답변

1

타임 스탬프 필드를 추가하면 마지막 작업이 언제 수행되었는지 알 수 있습니다. 그로부터 mysql 로그에서 te 업데이트 항목을 찾고 응용 프로그램 로그와 조정할 수 있습니다. `오래된 유산을 기반으로 system`이 더 비명 소리 만 또는

당신이 테이블에 트리거를 설정할 수 있습니다 ...

CREATE TRIGGER no_negatives_in_yourtable 
BEFORE UPDATE ON yourtable 
FOR EACH ROW 
BEGIN 
    IF (NEW.value<0) THEN 
    /* log it (NB will be rolled back if subsequent statement enabled */ 
    INSERT INTO badthings (....) VALUES (...); 
    /* this forces the operation to fail */ 
    DROP TABLE `less than zero value in yourtable`; 
    END IF; 
END 
+0

방아쇠는 내가 개인적으로 생각한 것입니다. 이를 응용 프로그램 내에서 호출이 만들어진 위치를 식별하는 추가 매개 변수와 결합하면 우승자가 될 수 있습니다. – David

+0

나에게 걱정거리가되는 것은 코드에 문제가 많지는 않지만 요청의 속도가 해당 db에서 시작된다는 것입니다. – David

+0

식별자를 삽입하기 위해 값이 업데이트되는 모든 위치를 식별 할 수 있으면 스택에서 이벤트를 캡처하여 그 이유를 찾거나 * 왜 *하고 있는지 확인하고 문제를 해결할 수 있습니다 그것을 측정. – symcbean