2009-09-03 6 views
0

일련의 기록 트리거를 설정하여 트리거를 통해 지정된 테이블의 기록을 자동으로 수집하려고합니다. 누군가가 앱에 저장하는 것에 대해 잊어 버렸 든 관계없이 모든 변경 사항을 캡처한다는 것을 보장하므로 트리거를 사용하고 싶습니다. 내 문제는 내가이 방아쇠를 당긴다는거야.MySQL에서 트리거로 레코드를 삭제 한 사용자의 USER_ID를 저장합니다.

CREATE TRIGGER `db`.`delete_history_trigger` BEFORE DELETE ON `db`.`payments` 
    FOR EACH ROW BEGIN 
      INSERT INTO `payments_history` select *, 'delete', NOW(), USER() from `payments` where `PAYMENT_ID` = OLD.`PAYMENT_ID`; 
    END 
// 

payments_historypayments에서이 물건의 모든 및 수행 된 작업을 채우고, 액션이 발생한 날짜/시간, 작업의 원인이 된 MySQL 사용자가 수행한다. 내 앱의 각 사용자는 저장하려는 USER_ID (users 테이블의 사용자)이 있습니다. 업데이트의 경우 USER_IDupdate 쿼리에 사용되는 하나의 필드이므로 문제가되지 않습니다. 그러나 삭제시 전달되는 데이터가 없으므로 NEW는 액세스 할 수 없으므로 액세스 할 수 없습니다. USER_ID 레코드를 업데이트하는 두 번째 쿼리를 수행하는 짧은 삭제 기록 테이블에 저장할 좋은 방법을 생각할 수 없습니다. 다른 사람들이 삭제 후 해당 레코드를 업데이트하는 메서드를 호출하는 것을 잊어 버릴 수 있으므로 데이터를 잃어 버릴 수도 있으므로이 솔루션을 사용하지 않을 것입니다.

답변

1

user_id 세션 변수의 값이 user_id가 아닌 경우 세션 변수를 user_id로 설정하고 트리거가 삭제를 중단하도록하십시오.

쿼리는 MySQL의 세션에서 user_id를 설정합니다 :

SET @user_id = <value of user_id> 

새로운 삭제 :

CREATE TRIGGER `db`.`delete_history_trigger` BEFORE DELETE ON `db`.`payments` 
    FOR EACH ROW BEGIN 
     INSERT INTO `payments_history` select *, 'delete', NOW(), USER(), @user_id from `payments` where `PAYMENT_ID` = OLD.`PAYMENT_ID`; 
    END 
// 
+0

과 같이, @USER_ID = SET? – baudtack

관련 문제