2011-10-02 33 views
0

我需要創建一個用戶活動日誌,然後將其插入到數據庫中。爲此,我正在考慮使用mysql觸發器,而不是在每個成功的查詢中放置一個查詢。 2表完全沒有關係。 下面是一個例子:在2個不相關的表上使用mysql觸發器

table_fruits

  • 水果名稱
  • 味道

table_log

  • 用戶ID
  • 0表
  • 時間戳

table_users

  • 用戶ID

現在,每當我插入表上水果的時候,也將值插入扳機table_log也會執行。我的問題在於獲取存儲在另一個表中的用戶標識。我如何確定要插入哪個用戶ID。據我所知,觸發器不需要參數,所以我不能使用它來提供我的腳本中的id。 任何想法?我應該使用存儲過程嗎?

回答

1

有3種方法是:

  • 正如你提到的,使用存儲過程插入到兩個主表和日誌表

  • 存儲用戶ID(由所提供app)作爲主(fruit)表中的列作爲「inserted_by」列;然後讓觸發器填充日誌表並從主表讀取用戶。

  • 讓觸發器自動找出用戶標識。這有兩種形式:

    1. 用戶ID上的應用程序並存,但不是在數據庫端(例如,一個用戶登錄到一個網頁,但CGI後端代碼始終連接到一個數據庫作爲特殊的「HTTP」數據庫用戶)。

    2. 應用程序的用戶標識實際上以相同名稱的數據庫用戶連接到數據庫。

      在這種情況下,你應該使用USER()(但current_user()這反而返回誰創建的觸發器,或者更準確地說,用於觸發權限檢查其ID)

1

當你插入水果表時,你也知道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')"; 
相關問題