2011-10-02 5 views
0

사용자 활동 로그를 생성 한 다음 데이터베이스에 삽입해야합니다. 그리고 이것을 위해, 나는 성공적인 쿼리마다 이것을하는 쿼리를 배치하는 대신에 mysql 트리거를 사용할 생각이다. 두 테이블은 전혀 관계가 없습니다. 다음은 예입니다 :관련없는 두 테이블에서 mysql 트리거 사용하기

table_fruits

  • 과일 이름

table_log

  • 사용자 ID
  • 0 테이블의
  • 이름
  • 타임 스탬프

table_users

  • 사용자 ID

지금은 테이블 과일에 삽입 할 때마다,에 값을 삽입 할 트리거 table_log도 실행됩니다. 내 문제는 여기에 다른 테이블에 저장된 사용자 ID를 얻는 것입니다. 삽입 할 사용자 ID는 어떻게 결정합니까? 내가 아는 한 트리거는 매개 변수를 필요로하지 않으므로 스크립트에서 ID를 제공하는 데 사용할 수는 없습니다. 아이디어가 있으십니까? 이 작업을 위해 저장 프로 시저 만 사용해야합니까?

답변

1

3 접근이에있다 : 당신이 언급 한 바와 같이

  • 는 모두 기본 테이블과에서 제공하는 로그 테이블

  • 스토어 사용자 ID (에 삽입 할 저장된 프로 시저를 사용 app)를 메인 (과일) 테이블의 열로 "inserted_by"열로; 그런 다음 트리거가 로그 테이블을 채우고 기본 테이블에서 사용자를 읽도록하십시오.

  • 트리거가 자동으로 사용자 ID를 찾습니다.

    1. 사용자 ID 응용 프로그램 측에 존재하지만, NOT 데이터베이스 측 (웹 페이지에서 예를 들어 사용자가 로그인하지만, CGI 백엔드 코드가 항상 데이터베이스에 같은 특별한 연결에 "HTTP"이 두 가지 맛이있다 데이터베이스 사용자).

    2. 앱의 사용자 ID는 실제로 동일한 이름의 데이터베이스 사용자로 DB에 연결됩니다.

      이 경우

      , 당신은 사용해야 USER() (그러나 하지 대신 트리거 권한 검사에 사용 된 ID 더 정확하게 트리거 또는 생성 누구든지 반환 current_user())

1

fruits 테이블에 삽입하면 user_id 값도 알 수 있습니다.

그래서 같은 블랙홀 테이블을 만들 제안 :

CREATE TABLE bh_fruit (
    user_id integer not null, 
    fruit_name varchar(255), 
    flavor varchar(255) 
) ENGINE = BLACKHOLE; 

는 블랙홀 테이블에 트리거를 넣습니다.

DELIMITER $$ 

CREATE TRIGGER ai_bh_fruit_each AFTER INSERT ON bh_fruit FOR EACH ROW 
BEGIN 
    INSERT INTO fruit (fruit_name, flavor) VALUES (NEW.fruit_name, NEW.flavor); 
    INSERT INTO log (user_id, tablename) VALUES (NEW.user_id, 'fruit'); 
END $$ 

DELIMITER ; 

이제 PHP 코드가된다 :

$user_id = mysql_real_escape_string($user_id); 
$fruit = mysql_real_escape_string($fruit); 
$flavor = mysql_real_escape_string($flavor); 
$sql = "INSERT INTO bh_fruit (user_id, fruit_name, flavor) 
      VALUES ('$user_id','$fruit','$flavor')";