2012-03-02 4 views
0

이렇게이 이 상당히 직선적 인 트리거가되어야하지만 내 MySQL은 훌륭하지 않으므로 의심의 여지없이 실패합니다.
stats 테이블을 업데이트해야합니다.MySQL 트리거가 트리거되지 않습니까?

DROP TRIGGER countryUpdate; 

DELIMITER // 

CREATE TRIGGER countryUpdate AFTER INSERT ON stats 
FOR EACH ROW BEGIN 
    DECLARE NewIP varchar(16); 
    DECLARE NewCountry varchar(80); 
    SET NewIP = inet_aton(new.vis_ip); 
    SET NewCountry = (SELECT country FROM iptocountry WHERE lower_bound <= NewIP AND upper_bound >= NewIP) 
    UPDATE stats 
     SET Country = NewCountry 

END // 

DELIMITER; 
+0

무엇이 오류 메시지입니까? –

+0

오류가 없으므로 문자 그대로 트리거되지 않은 것처럼 보입니다. 통계 표의 국가 열이 국가로 업데이트되지 않습니다. – FizzBuzz

답변

3

음, 첫째로, 당신의 UPDATE 전혀-된 stats 테이블에 모든 행을 변경하고 삽입 각 행에 대해 그렇게 작동 - 경우. 그건별로 의미가 없습니다. 최소한 삽입 한 행 하나만 치기 위해 where 절을 추가하려고합니다.

"a stored function or trigger cannot modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger."는 ("저장 함수에 대한 제한 사항"에서 봐) 때문에 외관상으로는, 그러나, 즉, MySQL의에서 전혀 작동하지 수

그래서 대신에, 당신이 삽입 트리거 전에 AA를 사용하고, 할 필요가 SET new.country = NewCountry 행을 고정하기 전에 수정해야합니다.

+0

Where 절의 부족을 잘 잡아라. 프로덕션 환경에서 디버깅을 상상해보십시오. –

+0

아, 그 포인터 주셔서 감사합니다. 문제는 여전히 행이 비록 점점 업데이 트되지 않습니다 ... 그 생각? – FizzBuzz

+0

@FizzBuzz 오, 그게 이미 사용중인 테이블을 업데이트 할 수 없기 때문입니다. MySQL의 알려진 제한 사항 - 제가 대답을 업데이트 할 것입니다. (죄송합니다, 이전에 넣었을 것입니다. 그러나 그것을 기억하고 그것을 보았습니다) – derobert

관련 문제