2017-02-17 34 views
0

我寫了一個觸發器,它會記錄每個數據更新,並且會記錄previous_value, new_value, field_name等等。但問題是我在我的表中有77字段。所以,很難爲每個字段編寫IF ENDIF,所以我想知道是否有可能使用循環編寫?想要在更新後寫一個觸發器

已要求在dba.stackexchange.com但沒有得到任何FRUITFULL答案,以下鏈接::

Link

到目前爲止我試過::

BEGIN 

IF(OLD.company_name != NEW.company_name) THEN 
INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "company_name", OLD.company_name, NEW.company_name, CURRENT_TIMESTAMP(), NEW.company_id); 
END IF; 
IF(OLD.company_first_name != NEW.company_first_name) THEN 
INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "company_first_name", OLD.company_first_name, NEW.company_first_name, CURRENT_TIMESTAMP(), NEW.company_id); 
END IF; 

END 

請幫助,或者任何建議都會非常有幫助。

在此先感謝。

+1

不是MySQL的範圍內。我會將information_schema.columns的內容轉儲到excel中並在那裏構建代碼。 –

回答

1

你不能自動做到這一點,但我理解你的觀點。只要你足夠聰明,懶惰實際上是計算機科學的質量。

我通常用「自動編程」來解決這類問題:生成生成代碼的代碼。

您有2個選項生成SQL語句:

1. Pure SQL 
2. Programming language 

下面是使用SQL的解決方案開始:

SELECT 
    CONCAT 
    (
     'IF(OLD.company_name != NEW.company_name) THEN \n 
     INSERT INTO elm_activity_log (user_id, action_on, action, action_col, action_old_value, action_new_value, action_at, action_on_id) VALUES (NEW.updated_by, "company", "update", "', T.column_name,'", OLD.', T.column_name, ', NEW.', T.column_name,', CURRENT_TIMESTAMP(), NEW.company_id); \n 
     END IF; \n 
     \n 
     ' 
    ) as SQLstatement 

FROM 
(
    SELECT column_name 
    FROM information_schema.columns 
    WHERE column_name NOT IN ('id') 
     AND table_name = 'your_table' 
     AND table_schema = 'database_name' 
) T 

它可能直接工作,它可能要重寫一個litlle位。你還沒有提供你的表DLL,所以我很難測試它是否工作。

想法是爲每個列名稱生成一行,其中包含該列觸發器部分的SQL語句。然後,您可以將此查詢的結果導出到文本文件中,等等。

在嵌套查詢中適應性相應地調整:table_name,table_schema和要從日誌記錄中排除的列(我設置'id')。

注意,在SELECT CONCAT,我添加了一些/n應該結束了在回車輸出