2012-04-24 11 views
0

ユーザー情報を保持するユーザーテーブルがあり、ユーザーがページを表示するたびにlast_activity列が更新されています。 0:禁止され、アクティブでない 1 - 3雇用者またはER - ショート 2のための従業員またはEE - 両方のタイプ このストアドファンクション/トリガーを呼び出したステートメントで既にテーブル格納トリガーを更新できません。

とステータス・フィールドである

public function set_last_activity(){ 
    global $db; 
    $t = time(); 
    $sql = "UPDATE `users` SET `last_activity` = '$t' 
    WHERE 
    `id` = '$this->id' "; 
    $db->query($sql); 
    } 

各ユーザーは、3種類の 1を持つことができます:アクティブ

今私はトリガーを持っており、それがユーザーのカウンター

を取り扱うだ employes [タイプ:1,3]について

(ee_counter採用のため、er_counter ER [TYPE:2,3]統計表内)

ユーザがステータス(0変更:禁止、1:アクティブ)と、それが特別料理、ユーザがemploye

DELIMITER $$ 
CREATE TRIGGER user_status_change 
    AFTER UPDATE 
    ON users 
    FOR EACH ROW 
BEGIN 
    UPDATE stats s 

SET 

    ee_counter = 
     CASE 

     WHEN (NEW.type= 1 || NEW.type= 3) && OLD.status !=1 && NEW.status = 1 THEN ee_counter + 1 
     WHEN (NEW.type= 1 || NEW.type= 3) && OLD.status = 1 && NEW.status != 1 THEN ee_counter - 1 

     WHEN NEW.type= 3 && OLD.type = 2 THEN ee_counter + 1 
     WHEN OLD.type= 1 && NEW.type = 2 THEN ee_counter - 1 
     ELSE ee_counter 
     END , 

    er_counter = 
     CASE 
     WHEN (NEW.type= 2 || NEW.type= 3) && OLD.status !=1 && NEW.status = 1 THEN er_counter + 1 
     WHEN (NEW.type= 2 || NEW.type= 3) && OLD.status = 1 && NEW.status != 1 THEN er_counter - 1 

     WHEN NEW.type= 3 && OLD.type = 1 THEN er_counter + 1 
     WHEN OLD.type= 2 && NEW.type = 1 THEN er_counter - 1 
     ELSE er_counter 
     END 

    WHERE 
    s.id = 1; 


    UPDATE specialitys s 
JOIN speciality_objects o 
     ON s.id = o.speciality_id 
    JOIN users u 
     ON o.user_id = u.id 
SET 
    counter = 
     CASE 
     WHEN NEW.status = 1 && OLD.status !=1 THEN counter + 1 
     WHEN NEW.status != 1 && OLD.status = 1 THEN counter - 1 
     ELSE counter 
     END 

    WHERE 
    o.user_id = NEW.id && s.id = o.speciality_id ; 

END $$ 

DELIMITER ; 

場合カウンタ更新それは私が私のホストを変更するまで、正常に動作するために使用して

はありません私はlast_activityを更新したときにすべてのページにこのエラー

Database query failed: Can't update table 'users' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

を得ることに保つVPSを買っいくつかは、それは私がこのエラーはとにかく無意味であるトリガ内の最後のUPDATEクエリの一部に起因していると思う。このエラー

答えて

0

なってまだ動作しませんでした示唆しているよう iは、更新前の使用しようとしました。

エラーメッセージがあるため、クエリのこの部分を訴えている:

JOIN users u 
    ON o.user_id = u.id 

...あなたは、トリガー内UPDATE問い合わせの上、トリガーが接続されているテーブルをJOINエドいます。 MySQLは、再帰が発生し、エラーが発生する可能性があることを正しく認識しています。

しかし、クエリのその部分を単に削除することはできます。エイリアスuはどこにも使用されないため、JOINは不要です。私はこれが問題を解決すると思います。

関連する問題